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 ) ; |
(desde C++23) | |
Asigna
count
*
sizeof
(
T
)
bytes de almacenamiento no inicializado, donde
count
es un valor entero no especificado no menor que
n
, mediante la llamada a
::
operator new
(posiblemente con un argumento adicional
std::align_val_t
), pero no está especificado cuándo ni cómo se llama a esta función.
Luego, esta función crea un arreglo de tipo T [ count ] en el almacenamiento e inicia su tiempo de vida, pero no inicia el tiempo de vida de ninguno de sus elementos.
Para poder utilizar esta función en una expresión constante, el almacenamiento asignado debe ser desasignado durante la evaluación de la misma expresión.
El uso de esta función está mal formado si
T
es un
tipo incompleto
.
Contenidos |
Parámetros
| n | - | el límite inferior del número de objetos para los cuales asignar almacenamiento |
Valor de retorno
std::
allocation_result
<
T
*
>
{
p, count
}
, donde
p
apunta al primer elemento de un array de
count
objetos de tipo
T
cuyos elementos aún no han sido construidos.
Excepciones
Lanza std::bad_array_new_length si std:: numeric_limits < std:: size_t > :: max ( ) / sizeof ( T ) < n , o std::bad_alloc si la asignación de memoria falla.
Notas
allocate_at_least
se proporciona principalmente para contenedores contiguos, por ejemplo
std::vector
y
std::basic_string
, con el fin de reducir las reasignaciones haciendo que su capacidad coincida con el tamaño realmente asignado cuando sea posible.
La redacción "no especificado cuándo y cómo" permite combinar u optimizar las asignaciones de memoria dinámica realizadas por los contenedores de la biblioteca estándar, aunque dichas optimizaciones están prohibidas para las llamadas directas a :: operator new . Por ejemplo, esto está implementado en libc++ ( [1] y [2] ).
Después de llamar a
allocate_at_least
y antes de la construcción de elementos, la aritmética de punteros de
T
*
está bien definida dentro del array asignado, pero el comportamiento es indefinido si se accede a los elementos.
| Macro de prueba de características | Valor | Std | Característica |
|---|---|---|---|
__cpp_lib_allocate_at_least
|
202302L
|
(C++23) |
allocate_at_least
etc.
|
Ejemplo
#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); }
Salida posible:
count: 69 res.ptr: 0x555a486a0960 res.count: 96
Véase también
|
(C++23)
|
registra la dirección y el tamaño real de almacenamiento asignado por
allocate_at_least
(plantilla de clase) |
|
[static]
(C++23)
|
asigna almacenamiento al menos tan grande como el tamaño solicitado mediante un asignador
(función miembro estática pública de
std::allocator_traits<Alloc>
)
|