std:: aligned_alloc
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
定义于头文件
<cstdlib>
|
||
|
void
*
aligned_alloc
(
std::
size_t
alignment,
std::
size_t
size
)
;
|
(C++17 起) | |
分配 size 字节的未初始化存储空间,其对齐方式由 alignment 指定( 隐式创建 目标区域中的对象)。 size 参数必须是 alignment 的整数倍。
以下函数需要满足线程安全要求:
- 库版本的 operator new 和 operator delete
- 用户替换版本的全局 operator new 和 operator delete
- std::calloc , std::malloc , std::realloc , std::aligned_alloc , std::free
对这些分配或释放特定存储单元函数的调用会以单一全序发生,且在此顺序中每个这样的释放调用 先发生于 下一个分配调用(如果存在)。
目录 |
参数
| alignment | - | 指定对齐方式。必须是实现支持的有效对齐值。 |
| size | - | 要分配的字节数。必须是 alignment 的整数倍。 |
返回值
成功时,返回指向新分配内存起始位置的指针。为避免内存泄漏,必须使用 std::free 或 std::realloc 释放返回的指针。
失败时,返回空指针。
注释
传递一个不是 alignment 整数倍的 size 参数,或传递无效或实现不支持的 alignment 参数,将导致函数执行失败并返回空指针(C11标准最初规定此情况为未定义行为,后经 DR460 修正)。
作为“实现支持”要求的一个示例,POSIX函数
posix_memalign
接受任何为2的幂且为
sizeof
(
void
*
)
倍数的
alignment
,而基于POSIX的
aligned_alloc
实现继承了此要求。
基础对齐总是被支持的。如果
alignment
是二的幂且不大于
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
|
|