std::allocator<T>:: allocate_at_least
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
|
(until C++20)
|
||||
|
allocator::allocate_at_least
(C++23)
|
||||
|
(until C++20)
|
||||
|
(until C++20)
|
||||
|
(until C++20)
|
||||
| Non-member functions | ||||
|
(until C++20)
|
|
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
(шаблон класса) |
|
[static]
(C++23)
|
выделяет память размером не меньше запрошенного через аллокатор
(публичная статическая функция-член
std::allocator_traits<Alloc>
)
|