std::aligned_alloc
來自 cppreference.com
定義於標頭檔案 <cstdlib> |
||
void* aligned_alloc( std::size_t alignment, std::size_t size ); |
(C++17 起) | |
分配 size 位元組的未初始化儲存空間,其對齊方式由 alignment 指定(隱式建立目標區域中的物件)。size 引數必須是 alignment 的整數倍。
以下函式必須是執行緒安全的
- 庫版本的 operator new 和 operator delete
- 使用者替換版本的全域性 operator new 和 operator delete
- std::calloc, std::malloc, std::realloc, std::aligned_alloc, std::free
對這些函式分配或解除分配特定儲存單元的呼叫以單一的總順序發生,並且每個此類解除分配呼叫在該順序中的下一次分配(如果有)之前發生。
目錄 |
[編輯] 引數
alignment | - | 指定對齊方式。必須是實現支援的有效對齊方式。 |
size | - | 要分配的位元組數。alignment 的整數倍。 |
[編輯] 返回值
成功時,返回指向新分配記憶體起始的指標。為避免記憶體洩漏,返回的指標必須使用 std::free 或 std::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
|