Spec-Zone.ru › C++

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

См. также

allocation_result
(C++23)
сохраняет адрес и фактический размер хранилища, выделенного allocate_at_least
(шаблон класса)
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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API