名稱空間
變體
操作

std::aligned_alloc

來自 cppreference.com
< cpp‎ | memory‎ | c
 
 
記憶體管理庫
(僅作說明*)
未初始化記憶體演算法
(C++17)
(C++17)
(C++17)
受約束的未初始化
記憶體演算法
C 庫
aligned_alloc
(C++17)


分配器
記憶體資源
垃圾回收支援
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
未初始化儲存
(直到 C++20*)
(直到 C++20*)
顯式生命週期管理
 
定義於標頭檔案 <cstdlib>
void* aligned_alloc( std::size_t alignment, std::size_t size );
(C++17 起)

分配 size 位元組的未初始化儲存空間,其對齊方式由 alignment 指定(隱式建立目標區域中的物件)。size 引數必須是 alignment 的整數倍。

以下函式必須是執行緒安全的

對這些函式分配或解除分配特定儲存單元的呼叫以單一的總順序發生,並且每個此類解除分配呼叫在該順序中的下一次分配(如果有)之前發生

目錄

[編輯] 引數

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

[編輯] 返回值

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

失敗時,返回空指標。

[編輯] 注意

傳遞的 size 不是 alignment 的整數倍,或者 alignment 無效或不被實現支援,會導致函式失敗並返回空指標(C11 釋出時指定此情況下為未定義行為,此問題已由 DR460 修正)。

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

基本對齊方式總是受支援。如果 alignment 是 2 的冪且不大於 alignof(std::max_align_t),則 aligned_alloc 可能只是簡單地呼叫 std::malloc

常規 std::malloc 對齊的記憶體適用於任何具有基本對齊的物件型別。此函式對於超對齊分配很有用,例如 SSE、快取行或 VM 頁邊界。

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

[編輯] 示例

#include <cstdio>
#include <cstdlib>
 
int main()
{
    int* p1 = static_cast<int*>(std::malloc(10 * sizeof *p1));
    std::printf("default-aligned address:   %p\n", static_cast<void*>(p1));
    std::free(p1);
 
    int* p2 = static_cast<int*>(std::aligned_alloc(1024, 1024));
    std::printf("1024-byte aligned address: %p\n", static_cast<void*>(p2));
    std::free(p2);
}

可能的輸出

default-aligned address:   0x2221c20
1024-byte aligned address: 0x2222400

[編輯] 參閱

(自 C++11)(C++23 中已棄用)
定義適合用作給定大小型別的未初始化儲存的型別
(類模板) [編輯]
C documentation for aligned_alloc