根據cppref:
std::allocator<T>::allocate_at_least分配
count * sizeof(T)位元組的未初始化的存盤,其中count是一個不小于n的未指定的整數值,通過呼叫::operator new(可能提供了一個額外的std::align_val_t引數然后,這個函式會被呼叫
::operator new(可能會提供額外的std::align_valt引數),但是沒有說明何時以及如何呼叫這個函式。然后,這個函式在存盤空間中創建了一個
T[count]型別的陣列,并開始其生命周期。 并開始它的生命周期,但沒有開始它的任何元素的生命周期。 元素的壽命。
然而,我認為已經存在的 std::allocator<T>:allocate 可以做同樣的事情。
為什么我們需要 std::allocator<T>:allocate_at_least 在C 23中?
uj5u.com熱心網友回復:
allocate可能會分配比要求的更多的元素,但它沒有辦法向其呼叫者回傳實際分配的大小。
這就是allocate_at_least的目的,它的實作可能與allocate相同,并且可能分配完全相同數量的元素,不同的是它能夠回傳分配給呼叫者的元素數量,這意味著呼叫者可以在必要時利用這些額外的元素。
uj5u.com熱心網友回復:
allocate_at_least與allocate做的事情不一樣。比較(allocate):
分配
n * sizeof(T)位元組的未初始化的存盤...
與(allocate_at_least):
分配
count * sizeof(T)位元組的未初始化的存盤,其中count是一個未指定的整數值,不小于n...
此外,allocate回傳:
指向
n型別的T物件陣列的第一個元素的指標...
當allocate_at_least回傳:
std::allocation_result<T*>{p, count},其中p指向count型別的T物件的陣列的第一個元素...
呼叫者因此得到了關于實際分配的大小的資訊。
動機可以在P0401R6;章節動機中找到:
考慮向向量添加元素的代碼:std::vector<int> v = {1, 2, 3}; // Expected: v.capacity() == 3 ///增加一個額外的元素,觸發一個重新分配。 v.push_back(4)。許多分配器只以固定大小的記憶體塊進行分配,對請求進行四舍五入。我們的底層堆分配器在構造v時收到了一個12位元組的請求(
3 * sizeof(int)),對于一些實作來說,這個請求被轉化為一個16位元組的區域。
uj5u.com熱心網友回復:
這來自于cppref的筆記:
allocate_at_least主要提供給連續的容器,例如std::vector和std::basic_string,以便盡可能使它們的容量與實際分配的大小一致,從而減少重新分配。
組成的堆分配成為可能。 優化標準庫的堆分配 容器,盡管這種優化在直接呼叫 呼叫::operator new時也不允許這種優化。例如,這是由 libc 實作的。"未指定的時間和方式"的措辭使得合并或優化由
在呼叫 allocate_at_least 之后和構建元素之前。 T*的指標算術在分配的陣列中被定義得很好。 但是,如果元素被訪問,其行為是未定義的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/309439.html
標籤:
