aligned_alloc
在标头 <stdlib.h> 定义
|
||
(C11 起) | ||
分配 size
个字节的未初始化存储空间,按照 alignment 指定对齐。size 形参必须是 alignment 的整数倍。
aligned_alloc
是线程安全的:它表现得如同只访问通过其参数可见的内存区域,而非任何静态存储。
解分配一块内存区域的先前 free、 free_sized 及 free_aligned_sized (C23 起) 或 realloc 调用同步于分配同一块或部分相同的内存区域的 aligned_alloc
调用。此同步出现于任何通过解分配函数所作的内存访问之后,和任何 aligned_alloc
所作出的内存访问之前。所有操作每块特定内存区域的分配和解分配函数拥有单独全序。
参数
alignment | - | 指定对齐。必须是实现支持的合法对齐。 |
size | - | 分配的字节数。alignment 的整数倍。 |
返回值
成功时,返回指向新分配内存的指针。为避免内存泄漏,返回的指针必须用 free() 或 realloc()
解分配。
失败时,返回空指针。
注解
传递不是 alignment 整数倍的 size,或传递实现不支持的 alignment,会令函数失败并返回空指针(出版时的 C11 指定此为未定义行为,这已经为 DR460 所更正)。N2072 提议移除大小限制,使之能在限制性的对齐边界分配小对象(类似 alignas)。
作为“实现支持”要求的例子,POSIX 函数 posix_memalign
接受任何是二的幂且为 sizeof(void*) 倍数的 alignment,而基于 POSIX 的 aligned_alloc 实现继承了此项要求。
基础对齐始终得到支持。若 alignment 是二的幂且不大于 _Alignof(max_align_t),则 aligned_alloc
可以简单地调用 malloc。
常规的 malloc 分配适用于具有任何基础对齐的对象类型的内存。aligned_alloc
适用于过对齐分配,例如对 SSE、缓存线或 VM 页边界。
Microsoft C 运行时库不支持此函数,因为其 std::free 的实现无法处理任意种类的对齐分配。MS CRT 提供 _aligned_malloc
作为替代(其结果应以 _aligned_free
释放)。
示例
可能的输出:
default-aligned addr: 0x1e40c20 1024-byte aligned addr: 0x1e41000
引用
- C23 标准(ISO/IEC 9899:2024):
- 7.22.3.1 The aligned_alloc function (第 TBD 页)
- C17 标准(ISO/IEC 9899:2018):
- 7.22.3.1 The aligned_alloc function (第 253 页)
- C11 标准(ISO/IEC 9899:2011):
- 7.22.3.1 The aligned_alloc function (第 347-348 页)