aligned_alloc

< c‎ | memory
定义于头文件 <stdlib.h>
void *aligned_alloc( size_t alignment, size_t size );
(C11 起)

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

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

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

参数

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

返回值

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

失败时,返回空指针。

注意

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

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

常规的 malloc 为任何对象类型对齐内存(实际上,这表示对齐到 _Alignof(max_align_t) )。此函数对于过度对齐的内存分配有用,譬如 SSE 、缓存线路,或是虚拟机页边界。

示例

#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

引用

  • C11 standard (ISO/IEC 9899:2011):
  • 7.22.3.1 The aligned_alloc function (p: 347-348)

参阅