xml*_*lmx 16 c++ performance standards allocator c++23
根据cppref:
std::allocator<T>::allocate_at_least
通过调用 (可能提供附加参数)分配
count * sizeof(T)
未初始化存储的字节,其中count
是不小于 的未指定整数值,但未指定何时以及如何调用此函数。n
::operator new
std::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
指向类型为对象的数组count
T
的第一个元素...
调用者因此获得有关实际分配的大小的信息。
动机可以在P0401R6中找到;部分动机:
考虑向向量添加元素的代码:
Run Code Online (Sandbox Code Playgroud)std::vector<int> v = {1, 2, 3}; // Expected: v.capacity() == 3 // Add an additional element, triggering a reallocation. v.push_back(4);
许多分配器仅分配固定大小的内存块,从而对请求进行四舍五入。我们的底层堆分配器在构造 v 时收到了 12 字节 ( ) 的请求
3 * sizeof(int)
。对于一些实现,该请求被转换为 16 字节区域。
归档时间: |
|
查看次数: |
1065 次 |
最近记录: |