Namespaces
Variants

aligned_alloc

From cppreference.net
定义于头文件 <stdlib.h>
void * aligned_alloc ( size_t alignment, size_t size ) ;
(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 进行释放)。

示例

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int *p1 = malloc(10*sizeof *p1);
    printf("default-aligned addr:   %p\n", (void*)p1);
    free(p1);
    int *p2 = aligned_alloc(1024, 1024*sizeof *p2);
    printf("1024-byte aligned addr: %p\n", (void*)p2);
    free(p2);
}

可能的输出:

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