aligned_alloc

aligned_alloc

在头文件中定义
void * aligned_alloc(size_t alignment,size_t size);(自C11以来)

分配size由其指定对齐的未初始化存储的字节alignment。该size参数必须是的整数倍alignment

aligned_alloc 是线程安全的:它的行为就好像只访问通过参数可见的内存位​​置,而不是任何静态存储。

先前调用freerealloc释放内存区域的同步 -调用aligned_alloc该内存分配同一区域或部分内存区域。在通过释放函数访问内存之后以及在通过内存访问内存之前,会发生此同步aligned_alloc。所有分配和解除分配功能在内存的每个特定区域都有一个总的顺序。

参数

对准-指定对齐。必须是实现支持的有效对齐。
尺寸-要分配的字节数。对齐的整数倍

返回值

成功时,将指针返回到新分配的内存的开始位置。返回的指针必须用free()或来解除分配realloc()

失败时,返回一个空指针。

笔记

传递一个size不是整数倍alignment或者一个alignment无效或不被实现支持的函数会导致函数失败并返回一个空指针(C11,如已发布的,在这种情况下指定了未定义的行为,这由DR 460进行了纠正)。n2072alignas已提出去除尺寸限制,以便在限制性对齐边界处分配小物体(类似于)。

作为“由实施”支持的示例,POSIX函数posix_memalign接受任何基于POSIX的实现继承此需求alignment的两个和多个实例。sizeof(void *)aligned_alloc

定期malloc对齐适合任何对象类型的内存(实际上,这意味着它与之对齐alignof(max_align_t))。此函数对于超对齐分配(例如SSE,缓存行或VM页面边界)非常有用。

#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标准(ISO / IEC 9899:2011):