std::allocator::allocate_at_least
[[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 и т.д.
|
Пример
| Этот раздел не завершён Причина: нет примера |
Смотрите также
(C++23) |
записывает адрес и фактический размер памяти, выделенной allocate_at_least (шаблон класса) |
[static] (C++23) |
выделяет память не менее запрошенного размера с помощью аллокатора (public static функция-элемент std::allocator_traits)
|