命名空间
变体
操作

std::aligned_alloc

来自 cppreference.com
< cpp‎ | memory‎ | c
 
 
工具库
语言支持
类型支持 (基本类型,RTTI)
库特性测试宏 (C++20)
动态内存管理
程序工具
协程支持 (C++20)
可变参数函数
调试支持
(C++26)
三路比较
(C++20)
(C++20)(C++20)(C++20)
(C++20)(C++20)(C++20)
通用工具
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中已弃用)
整数比较函数
(C++20)(C++20)(C++20)   
(C++20)
交换类型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
通用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
基本字符串转换
(C++17)
(C++17)

 
动态内存管理
未初始化内存算法
受约束的未初始化内存算法
分配器
垃圾收集支持
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)



 
定义在头文件 <cstdlib>
void* aligned_alloc( std::size_t alignment, std::size_t size );
(自 C++17 起)

分配 size 字节的未初始化存储空间,其对齐方式由 alignment 指定 (隐式创建 目标区域中的对象)。 size 参数必须是 alignment 的整数倍。

以下函数必须是线程安全的

分配或释放特定存储单元的这些函数调用以单个总顺序发生,并且每个这样的释放调用 发生在 此顺序中的下一个分配(如果有)之前。

内容

[编辑] 参数

alignment - 指定对齐方式。必须是实现支持的有效对齐方式。
size - 要分配的字节数。 alignment 的整数倍。

[编辑] 返回值

如果成功,则返回指向新分配内存的起始位置的指针。为避免内存泄漏,必须使用 std::freestd::realloc 释放返回的指针。

如果失败,则返回空指针。

[编辑] 注释

传递不是 alignment 的整数倍的 size 或不是实现支持的有效对齐方式的 alignment 会导致函数失败并返回空指针(已发布的 C11 在这种情况下指定了未定义的行为,这已通过 DR460 修正)。

作为“实现支持”要求的示例,POSIX 函数 posix_memalign 接受任何是 2 的幂并且是 sizeof(void*) 的倍数的 alignment,并且基于 POSIX 的 aligned_alloc 实现继承了此要求。

始终支持基本对齐。如果alignment 是 2 的幂,并且不大于alignof(std::max_align_t)aligned_alloc 可能会简单地调用 std::malloc

常规 std::malloc 将内存对齐到适合任何具有基本对齐的对象类型的内存。此函数对于过度对齐的分配很有用,例如对于 SSE、缓存行或 VM 页面 边界。

此函数在 Microsoft C 运行时库中不受支持,因为它的 std::free 实现 无法处理任何类型的对齐分配。相反,MS CRT 提供 _aligned_malloc(使用 _aligned_free 释放)。

[编辑] 示例

#include <cstdio>
#include <cstdlib>
 
int main()
{
    int* p1 = static_cast<int*>(std::malloc(10 * sizeof *p1));
    std::printf("default-aligned address:   %p\n", static_cast<void*>(p1));
    std::free(p1);
 
    int* p2 = static_cast<int*>(std::aligned_alloc(1024, 1024));
    std::printf("1024-byte aligned address: %p\n", static_cast<void*>(p2));
    std::free(p2);
}

可能的输出

default-aligned address:   0x2221c20
1024-byte aligned address: 0x2222400

[编辑] 另请参阅

(C++11)(C++23 中已弃用)
定义适合用作给定大小类型的未初始化存储的类型
(类模板) [编辑]
C 文档 for aligned_alloc