跳到主要内容

std::allocator<T>::allocate_at_least

自 C++23 起
[[nodiscard]] constexpr std::allocation_result<T*, std::size_t>
allocate_at_least( std::size_t n );

分配count * sizeof(T)字节的未初始化存储,其中count是一个未指定但大于或等于n的整数值,通过调用::operator new (可能会提供一个额外的std::align_val_t参数)来实现,但该函数何时以及如何被调用是未指定的。

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

要在常量表达式中使用此函数,分配的存储必须在同一表达式的求值过程中被释放。

如果T不完整类型,则使用此函数是格式错误(ill-formed)的。

参数

n - 要为其分配存储的对象数量的下限

返回值

std::allocation_result<T*>{p, count},其中p指向一个由countT类型对象组成的数组的第一个元素,这些元素的构造尚未开始。

异常

如果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*的指针算术在分配的数组内是良好定义的,但如果访问元素,行为是未定义的。

特性测试宏标准注释
__cpp_lib_allocate_at_least202302L(C++23)allocate_at_least 等

示例

本节不完整

std::allocator<T>::allocate_at_least

自 C++23 起
[[nodiscard]] constexpr std::allocation_result<T*, std::size_t>
allocate_at_least( std::size_t n );

分配count * sizeof(T)字节的未初始化存储,其中count是一个未指定但大于或等于n的整数值,通过调用::operator new (可能会提供一个额外的std::align_val_t参数)来实现,但该函数何时以及如何被调用是未指定的。

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

要在常量表达式中使用此函数,分配的存储必须在同一表达式的求值过程中被释放。

如果T不完整类型,则使用此函数是格式错误(ill-formed)的。

参数

n - 要为其分配存储的对象数量的下限

返回值

std::allocation_result<T*>{p, count},其中p指向一个由countT类型对象组成的数组的第一个元素,这些元素的构造尚未开始。

异常

如果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*的指针算术在分配的数组内是良好定义的,但如果访问元素,行为是未定义的。

特性测试宏标准注释
__cpp_lib_allocate_at_least202302L(C++23)allocate_at_least 等

示例

本节不完整