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
实现继承此要求。
常规的 malloc 为任何对象类型对齐内存(实际上,这表示对齐到 _Alignof(max_align_t) )。此函数对于过度对齐的内存分配有用,譬如 SSE 、缓存线路,或是虚拟机页边界。
示例
运行此代码
可能的输出:
default-aligned addr: 0x1e40c20 1024-byte aligned addr: 0x1e41000
引用
- C11 standard (ISO/IEC 9899:2011):
- 7.22.3.1 The aligned_alloc function (p: 347-348)