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
接受任何为2的幂且是
sizeof
(
void
*
)
倍数的
alignment
,而基于POSIX的
aligned_alloc
实现继承了这个要求。
基础对齐始终受支持。如果
alignment
是二的幂且不大于
_Alignof
(
max_align_t
)
,
aligned_alloc
可能直接调用
malloc
。
常规的
malloc
会对齐适用于具有基础对齐要求的任何对象类型的内存。而
aligned_alloc
则适用于过度对齐的分配场景,例如对齐到
SSE
、缓存行或
虚拟机页面
边界的情况。
此函数在 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 aligned_alloc 函数 (p: TBD)
- C17 标准 (ISO/IEC 9899:2018):
-
- 7.22.3.1 aligned_alloc 函数 (p: 253)
- C11 标准 (ISO/IEC 9899:2011):
-
- 7.22.3.1 aligned_alloc 函数 (p: 347-348)
参见
|
C++ 文档
关于
aligned_alloc
|