命名空间
变体
操作

std::aligned_alloc

来自 cppreference.cn
< cpp‎ | memory‎ | c
 
 
内存管理库
(仅作说明*)
未初始化内存算法
(C++17)
(C++17)
(C++17)
受约束的未初始化
内存算法
C 库
aligned_alloc
(C++17)


分配器
内存资源
垃圾回收支持
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
未初始化存储
(直到 C++20*)
(直到 C++20*)
显式生命周期管理
 
定义于头文件 <cstdlib>
void* aligned_alloc( std::size_t alignment, std::size_t size );
(C++17 起)

分配 size 字节的未初始化存储空间,其对齐方式由 alignment 指定(隐式创建目标区域中的对象)。size 参数必须是 alignment 的整数倍。

以下函数必须是线程安全的

对这些函数分配或解除分配特定存储单元的调用以单一的总顺序发生,并且每个此类解除分配调用在该顺序中的下一次分配(如果有)之前发生

目录

[编辑] 参数

alignment - 指定对齐方式。必须是实现支持的有效对齐方式。
size - 要分配的字节数。alignment 的整数倍。

[编辑] 返回值

成功时,返回指向新分配内存起始的指针。为避免内存泄漏,返回的指针必须使用 std::freestd::realloc 解除分配。

失败时,返回空指针。

[编辑] 注意

传递的 size 不是 alignment 的整数倍,或者 alignment 无效或不被实现支持,会导致函数失败并返回空指针(C11 发布时指定此情况下为未定义行为,此问题已由 DR460 修正)。

作为“由实现支持”要求的一个示例,POSIX 函数 posix_memalign 接受任何是 2 的幂且是 sizeof(void*) 倍数的 alignment,并且基于 POSIX 的 aligned_alloc 实现继承了这些要求。

基本对齐方式总是受支持。如果 alignment 是 2 的幂且不大于 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 documentation for aligned_alloc