std::allocator<T>::allocate_at_least

< cpp‎ | memory‎ | allocator
[[nodiscard]] constexpr std::allocation_result<T*>
    allocate_at_least( std::size_t n );
(C++23 起)

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

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

为在常量表达式中使用此函数,必须在同一表达式的求值内解分配其所分配的存储。

T不完整类型则此函数的使用为非良构。

参数

n - 要分配存储的对象数的下界

返回值

std::allocation_result<T*>{p, count} ,其中 p 指向 T 类型的 n 个对象的数组首元素的指针,数组元素尚未构造。

异常

std::numeric_limits<std::size_t>::max() / sizeof(T) < n 则抛出 std::bad_array_new_length ,或若分配失败则抛出 std::bad_alloc

注解

allocate_at_least 主要为连续容器,例如 std::vectorstd::basic_string 提供,以通过使得其容量在可能时匹配实际分配的大小减少重分配。

遣词“未指定何时及如何”令标准库容器可以组合或优化掉堆分配,即使对直接调用 ::operator new 禁止这种优化。例如 libc++ 实现了它( [1][2]

在调用 allocate_at_least 后、构造元素前, T* 的指针算术在分配的数组内是良定义的,但若访问元素则行为未定义。

参阅

经由分配器分配至少与请求的大小一样大的存储
(函数模板)