Пространства имён
Варианты
Действия

std::allocator::allocate_at_least

Материал из cppreference.com
 
 
Динамическое управление памятью
no section name
Ограниченные алгоритмы неинициализированной памяти
no section name
Поддержка сбора мусора
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)



no section name
 
std::allocator
Функции-элементы
(до C++20)
(до C++20)
Функции, не являющиеся элементами
 
<tbody> </tbody>
[[nodiscard]] 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 и т.д.

Пример

Смотрите также

записывает адрес и фактический размер памяти, выделенной allocate_at_least
(шаблон класса) [править]
[static] (C++23)
выделяет память не менее запрошенного размера с помощью аллокатора
(public static функция-элемент std::allocator_traits) [править]