?
Ce document utilise Manuel du site Web PHP chinois Libérer
在頭文件<stdlib.h>中定義 | ||
---|---|---|
void * aligned_alloc(size_t alignment,size_t size); | (自C11以來) |
分配size
由其指定對齊的未初始化存儲的字節(jié)alignment
。該size
參數(shù)必須是的整數(shù)倍alignment
。
aligned_alloc
是線程安全的:它的行為就好像只訪問通過參數(shù)可見的內(nèi)存位置,而不是任何靜態(tài)存儲。
先前調(diào)用free
或realloc
釋放內(nèi)存區(qū)域的同步 -調(diào)用aligned_alloc
該內(nèi)存分配同一區(qū)域或部分內(nèi)存區(qū)域。在通過釋放函數(shù)訪問內(nèi)存之后以及在通過內(nèi)存訪問內(nèi)存之前,會發(fā)生此同步aligned_alloc
。所有分配和解除分配功能在內(nèi)存的每個特定區(qū)域都有一個總的順序。
對準(zhǔn) | - | 指定對齊。必須是實現(xiàn)支持的有效對齊。 |
---|---|---|
尺寸 | - | 要分配的字節(jié)數(shù)。對齊的整數(shù)倍 |
成功時,將指針返回到新分配的內(nèi)存的開始位置。返回的指針必須用free()
或來解除分配realloc()
。
失敗時,返回一個空指針。
傳遞一個size
不是整數(shù)倍alignment
或者一個alignment
無效或不被實現(xiàn)支持的函數(shù)會導(dǎo)致函數(shù)失敗并返回一個空指針(C11,如已發(fā)布的,在這種情況下指定了未定義的行為,這由DR 460進行了糾正)。n2072alignas
已提出去除尺寸限制,以便在限制性對齊邊界處分配小物體(類似于)。
作為“由實施”支持的示例,POSIX函數(shù)posix_memalign接受任何基于POSIX的實現(xiàn)繼承此需求alignment
的兩個和多個實例。sizeof(void *)aligned_alloc
定期malloc
對齊適合任何對象類型的內(nèi)存(實際上,這意味著它與之對齊alignof(max_align_t)
)。此函數(shù)對于超對齊分配(例如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: 0x1e40c201024-byte aligned addr: 0x1e41000
C11標(biāo)準(zhǔn)(ISO / IEC 9899:2011):
7.22.3.1 aligned_alloc函數(shù)(p:347-348)