命名空间
变体
操作

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 的整数倍。

以下函数需要是线程安全的

对这些函数的调用(分配或释放特定存储单元)以单一全序发生,并且每个这样的释放调用 先于 此顺序中的下一次分配(如果有)。

内容

[edit] 参数

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

[edit] 返回值

成功时,返回指向新分配内存开头的指针。为避免内存泄漏,返回的指针必须使用 std::freestd::realloc 释放。

失败时,返回空指针。

[edit] 注解

传递的 size 不是 alignment 的整数倍,或者 alignment 不是有效或实现不支持的对齐方式,都会导致函数失败并返回空指针(已发布的 C11 在这种情况下指定了未定义行为,这已通过 DR460 修正)。

作为“实现所支持”要求的示例,POSIX 函数 posix_memalign 接受任何 alignment,只要它是 2 的幂且是 sizeof(void*) 的倍数,并且基于 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 释放)。

[edit] 示例

#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

[edit] 参见

(自 C++11 起)(在 C++23 中弃用)
定义适合用作给定大小类型的未初始化存储的类型
(类模板) [编辑]
C 文档 关于 aligned_alloc