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 ) ;
(depuis C++23)

Alloue count * sizeof ( T ) octets de stockage non initialisé, où count est une valeur entière non spécifiée non inférieure à n , en appelant :: operator new (éventuellement avec un argument supplémentaire std::align_val_t ), mais il n'est pas spécifié quand et comment cette fonction est appelée.

Ensuite, cette fonction crée un tableau de type T [ count ] dans le stockage et commence sa durée de vie, mais ne commence pas la durée de vie d'aucun de ses éléments.

Pour utiliser cette fonction dans une expression constante, le stockage alloué doit être désalloué lors de l'évaluation de la même expression.

L'utilisation de cette fonction est mal formée si T est un type incomplet .

Table des matières

Paramètres

n - la limite inférieure du nombre d'objets pour lesquels allouer de la mémoire

Valeur de retour

std:: allocation_result < T * > { p, count } , où p pointe vers le premier élément d'un tableau de count objets de type T dont les éléments n'ont pas encore été construits.

Exceptions

Lance std::bad_array_new_length si std:: numeric_limits < std:: size_t > :: max ( ) / sizeof ( T ) < n , ou std::bad_alloc si l'allocation échoue.

Notes

allocate_at_least est principalement fourni pour les conteneurs contigus, par exemple std::vector et std::basic_string , afin de réduire les réallocations en faisant correspondre leur capacité à la taille réellement allouée lorsque cela est possible.

La formulation « non spécifiée quand et comment » permet de combiner ou optimiser les allocations de tas effectuées par les conteneurs de la bibliothèque standard, même si de telles optimisations sont interdites pour les appels directs à :: operator new . Par exemple, cela est implémenté par libc++ ( [1] et [2] ).

Après l'appel de allocate_at_least et avant la construction des éléments, l'arithmétique des pointeurs de T * est bien définie au sein du tableau alloué, mais le comportement est indéfini si les éléments sont accédés.

Macro de test de fonctionnalité Valeur Norme Fonctionnalité
__cpp_lib_allocate_at_least 202302L (C++23) allocate_at_least etc.

Exemple

#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);
}

Sortie possible :

count: 69
res.ptr: 0x555a486a0960
res.count: 96

Voir aussi

enregistre l'adresse et la taille réelle du stockage alloué par allocate_at_least
(modèle de classe)
[static] (C++23)
alloue un stockage d'au moins la taille demandée via un allocateur
(fonction membre statique publique de std::allocator_traits<Alloc> )