Namespaces
Variants

std::allocator<T>:: allocate_at_least

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
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

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

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