为什么在 C++23 中 allocate_at_least() ?

xml*_*lmx 16 c++ performance standards allocator c++23

根据cppref

std::allocator<T>::allocate_at_least

通过调用 (可能提供附加参数)分配count * sizeof(T)未初始化存储的字节,其中 count是不小于 的未指定整数值,但未指定何时以及如何调用此函数。n::operator newstd::align_val_t

T[count]然后,该函数在存储中创建一个类型数组并开始其生命周期,但不会启动其任何元素的生命周期。

然而,我认为现有的std::allocator<T>::allocate可以做同样的事情。

为什么我们需要 std::allocator<T>::allocate_at_least C++23?

Ala*_*les 21

allocate可能会分配比请求更多的元素,但它无法将实际分配的大小返回给调用者。

这就是 的目的allocate_at_least,它的实现可能与 相同,allocate并且可能分配完全相同数量的元素,不同之处在于它能够返回分配给调用者的元素数量,这意味着调用者可以利用这些额外的元素必要时的元素。


Dan*_*ica 15

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指向类型为对象的数组countT的第一个元素...

调用者因此获得有关实际分配的大小的信息。

动机可以在P0401R6中找到;部分动机

考虑向向量添加元素的代码:

std::vector<int> v = {1, 2, 3};
// Expected: v.capacity() == 3

// Add an additional element, triggering a reallocation.
v.push_back(4);
Run Code Online (Sandbox Code Playgroud)

许多分配器仅分配固定大小的内存块,从而对请求进行四舍五入。我们的底层堆分配器在构造 v 时收到了 12 字节 ( ) 的请求3 * sizeof(int)。对于一些实现,该请求被转换为 16 字节区域。