std::allocator<T>::allocate_at_least
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 является неполным типом.
Параметры
| n | - | нижняя граница количества объектов, для которых следует выделить хранилище |
Возвращаемое значение
std::allocation_result<T*>{p, count}, где p указывает на первый элемент массива из count объектов типа T, элементы которого ещё не были сконструированы.
Исключения
Выбрасывает std::bad_array_new_length, если std::numeric_limits<std::size_t>::max() / sizeof(T) < n, или 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 (шаблон класса) |
|
[статическая] (C++23) | выделяет с помощью аллокатора хранилище размером не меньше запрошенного (открытая статическая функция-член std::allocator_traits<Alloc>) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/memory/allocator/allocate_at_least