名稱空間
變體
操作

aligned_alloc

來自 cppreference.com
< c‎ | 記憶體
在標頭檔案 <stdlib.h> 中定義
void *aligned_alloc( size_t alignment, size_t size );
(C11 起)

分配 size 位元組的未初始化儲存,其對齊由 alignment 指定。 size 引數必須是 alignment 的整數倍。

aligned_alloc 是執行緒安全的:其行為如同只訪問透過其引數可見的記憶體位置,而不訪問任何靜態儲存。

先前對 freefree_sizedfree_aligned_sized(C23 起)realloc 的呼叫,如果釋放了某個記憶體區域,則與隨後對 aligned_alloc 的呼叫“同步”,該呼叫分配相同或部分相同的記憶體區域。此同步在釋放函式訪問記憶體之後,以及 aligned_alloc 訪問記憶體之前發生。對每個特定記憶體區域操作的所有分配和釋放函式存在一個單一的總順序。

目錄

[編輯] 引數

alignment - 指定對齊。必須是實現支援的有效對齊。
size - 要分配的位元組數。必須是 alignment 的整數倍。

[編輯] 返回值

成功時,返回指向新分配記憶體起始的指標。為避免記憶體洩漏,返回的指標必須用 freerealloc 解分配。

失敗時,返回空指標。

[編輯] 注意

傳遞的 size 不是 alignment 的整數倍,或 alignment 無效或不受實現支援,將導致函式失敗並返回空指標(C11 釋出時在此情況下指定了未定義行為,此問題已透過 DR460 修正)。 N2072 提出了移除大小限制,以實現在限制性對齊邊界上分配小物件(類似於 alignas)。

作為“由實現支援”要求的一個例子,POSIX 函式 posix_memalign 接受任何是 2 的冪且是 sizeof(void *) 倍數的 alignment,並且基於 POSIX 的 aligned_alloc 實現繼承了這些要求。

基本對齊始終受支援。如果 alignment 是 2 的冪且不大於 _Alignof(max_align_t)aligned_alloc 可能只是簡單地呼叫 malloc

常規的 malloc 會對記憶體進行對齊,使其適用於具有基本對齊的任何物件型別。 aligned_alloc 對於超對齊分配很有用,例如 SSE、快取行或 VM 頁面邊界。

Microsoft C 執行時庫不支援此函式,因為其 std::free 的實現無法處理任何型別的對齊分配。相反,MS CRT 提供了 _aligned_malloc(需要用 _aligned_free 釋放)。

[編輯] 示例

#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

[編輯] 參考

  • C23 標準 (ISO/IEC 9899:2024)
  • 7.22.3.1 aligned_alloc 函式 (p: TBD)
  • C17 標準 (ISO/IEC 9899:2018)
  • 7.22.3.1 aligned_alloc 函式 (p: 253)
  • C11 標準 (ISO/IEC 9899:2011)
  • 7.22.3.1 aligned_alloc 函式 (p: 347-348)

[編輯] 另請參見

C++ 文件 中的 aligned_alloc