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 ) ;
(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

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> )