aligned_alloc
aligned_alloc
在头文件 | | |
---|---|---|
void * aligned_alloc(size_t alignment,size_t size); | | (自C11以来) |
分配size
由其指定对齐的未初始化存储的字节alignment
。该size
参数必须是的整数倍alignment
。
aligned_alloc
是线程安全的:它的行为就好像只访问通过参数可见的内存位置,而不是任何静态存储。
先前调用free
或realloc
释放内存区域的同步 -
调用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):