std::allocator<T>::allocate_at_least
来自 cppreference.cn
constexpr std::allocation_result<T*, std::size_t> allocate_at_least( std::size_t n ); |
(C++23 起) | |
分配 count * sizeof(T) 字节的未初始化存储,其中 count
是一个不小于 n 的未指定整数值,通过调用 ::operator new(可能带有额外的 std::align_val_t 参数),但此函数何时以及如何被调用是未指定的。
然后,此函数在存储中创建一个类型为 T[count] 的数组并启动其生命周期,但不会启动其任何元素的生命周期。
为了在常量表达式中使用此函数,已分配的存储必须在同一表达式的求值过程中被释放。
如果 T
是 不完整类型,则此函数的使用是 ill-formed 的。
目录 |
[编辑] 参数
n | - | 要分配存储的对象数量的下限 |
[编辑] 返回值
std::allocation_result<T*>{p, count},其中 p
指向一个包含 count
个类型为 T
的对象的数组的第一个元素,这些元素尚未被构造。
[编辑] 异常
如果 std::numeric_limits<std::size_t>::max() / sizeof(T) < n,则抛出 std::bad_array_new_length;如果分配失败,则抛出 std::bad_alloc。
[编辑] 注意
allocate_at_least
主要用于连续容器,例如 std::vector 和 std::basic_string,通过在可能的情况下使其容量与实际分配的大小匹配来减少重新分配。
"未指定何时以及如何" 的措辞使得标准库容器进行的堆分配能够被 合并或优化掉,即使对于直接调用 ::operator new 而言,此类优化是被禁止的。例如,这由 libc++ 实现([1] 和 [2])。
在调用 allocate_at_least
之后和元素构造之前,T* 的指针算术在已分配的数组中是良好定义的,但如果访问元素,则行为是未定义的。
特性测试宏 | 值 | 标准 | 特性 |
---|---|---|---|
__cpp_lib_allocate_at_least |
202302L |
(C++23) | allocate_at_least 等 |
[编辑] 示例
运行此代码
#include <memory> #include <print> int main() { const std::size_t count{69}; std::allocator<int> alloc; std::allocation_result res{alloc.allocate_at_least(count)}; std::print("count: {}\n" "res.ptr: {}\n" "res.count: {}\n", count, res.ptr, res.count); /* construct, use, then destroy elements */ alloc.deallocate(res.ptr, res.count); }
可能的输出
count: 69 res.ptr: 0x555a486a0960 res.count: 96
[编辑] 另请参阅
(C++23) |
记录 allocate_at_least 分配的存储地址和实际大小(类模板) |
[static] (C++23) |
通过分配器分配至少请求大小的存储空间 ( std::allocator_traits<Alloc> 的公共静态成员函数) |