非常教程

C参考手册

动态内存管理 | Dynamic memory management

aligned_alloc

在头文件<stdlib.h>中定义

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):
    • 7.22.3.1 aligned_alloc函数(p:347-348)

动态内存管理 | Dynamic memory management相关

C

C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。