Namespaces
Variants

std:: aligned_alloc

From cppreference.net
< cpp ‎ | memory ‎ | c
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
定义于头文件 <cstdlib>
void * aligned_alloc ( std:: size_t alignment, std:: size_t size ) ;
(C++17 起)

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

以下函数需要满足线程安全要求:

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

目录

参数

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