aligned_alloc

来自cppreference.com
< c‎ | memory
在标头 <stdlib.h> 定义
void *aligned_alloc( size_t alignment, size_t size );
(C11 起)

分配 size 个字节的未初始化存储空间,按照 alignment 指定对齐。size 形参必须是 alignment 的整数倍。

aligned_alloc 是线程安全的:它表现得如同只访问通过其参数可见的内存区域,而非任何静态存储。

解分配一块内存区域的先前 freefree_sizedfree_aligned_sized (C23 起)realloc 调用同步于分配同一块或部分相同的内存区域的 aligned_alloc 调用。此同步出现于任何通过解分配函数所作的内存访问之后,和任何 aligned_alloc 所作出的内存访问之前。所有操作每块特定内存区域的分配和解分配函数拥有单独全序。

参数

alignment - 指定对齐。必须是实现支持的合法对齐。
size - 分配的字节数。alignment 的整数倍。

返回值

成功时,返回指向新分配内存的指针。为避免内存泄漏,返回的指针必须用 free()realloc() 解分配。

失败时,返回空指针。

注解

传递不是 alignment 整数倍的 size,或传递实现不支持的 alignment,会令函数失败并返回空指针(出版时的 C11 指定此为未定义行为,这已经为 DR460 所更正)。N2072 提议移除大小限制,使之能在限制性的对齐边界分配小对象(类似 alignas)。

作为“实现支持”要求的例子,POSIX 函数 posix_memalign 接受任何是二的幂且为 sizeof(void*) 倍数的 alignment,而基于 POSIX 的 aligned_alloc 实现继承了此项要求。

基础对齐始终得到支持。若 alignment 是二的幂且不大于 _Alignof(max_align_t),则 aligned_alloc 可以简单地调用 malloc

常规的 malloc 分配适用于具有任何基础对齐的对象类型的内存。aligned_alloc 适用于过对齐分配,例如对 SSE、缓存线或 VM 页边界。

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 The aligned_alloc function (第 TBD 页)
  • C17 标准(ISO/IEC 9899:2018):
  • 7.22.3.1 The aligned_alloc function (第 253 页)
  • C11 标准(ISO/IEC 9899:2011):
  • 7.22.3.1 The aligned_alloc function (第 347-348 页)

参阅