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