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

Reserviert count * sizeof ( T ) Bytes nicht initialisierten Speichers, wobei count ein nicht näher spezifizierter ganzzahliger Wert nicht kleiner als n ist, durch Aufruf von :: operator new (möglicherweise mit einem zusätzlichen std::align_val_t Argument), aber es ist nicht spezifiziert wann und wie diese Funktion aufgerufen wird.

Dann erstellt diese Funktion ein Array vom Typ T [ count ] im Speicher und beginnt seine Lebensdauer, startet jedoch nicht die Lebensdauer eines seiner Elemente.

Um diese Funktion in einem konstanten Ausdruck zu verwenden, muss der allokierte Speicher innerhalb der Auswertung desselben Ausdrucks freigegeben werden.

Die Verwendung dieser Funktion ist fehlerhaft, falls T ein incomplete type ist.

Inhaltsverzeichnis

Parameter

n - die untere Grenze der Anzahl von Objekten, für die Speicher reserviert werden soll

Rückgabewert

std:: allocation_result < T * > { p, count } , wobei p auf das erste Element eines Arrays von count Objekten des Typs T zeigt, deren Elemente noch nicht konstruiert wurden.

Exceptions

Wirft std::bad_array_new_length falls std:: numeric_limits < std:: size_t > :: max ( ) / sizeof ( T ) < n , oder std::bad_alloc falls die Allokation fehlschlägt.

Hinweise

allocate_at_least wird hauptsächlich für zusammenhängende Container bereitgestellt, z.B. std::vector und std::basic_string , um Neuzuordnungen zu reduzieren, indem ihre Kapazität nach Möglichkeit der tatsächlich zugewiesenen Größe angepasst wird.

Die Formulierung "unspecified when and how" ermöglicht es, Heap-Allokationen zu kombinieren oder wegzuoptimieren , die von den Standardbibliothek-Containern durchgeführt werden, selbst wenn solche Optimierungen für direkte Aufrufe von :: operator new nicht erlaubt sind. Zum Beispiel wird dies von libc++ implementiert ( [1] und [2] ).

Nach dem Aufruf von allocate_at_least und vor der Konstruktion der Elemente ist die Zeigerarithmetik von T * innerhalb des allozierten Arrays wohldefiniert, aber das Verhalten ist undefiniert, wenn auf Elemente zugegriffen wird.

Feature-Test Makro Wert Std Feature
__cpp_lib_allocate_at_least 202302L (C++23) allocate_at_least usw.

Beispiel

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

Mögliche Ausgabe:

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

Siehe auch

speichert die Adresse und die tatsächliche Größe des durch allocate_at_least allozierten Speichers
(Klassentemplate)
[static] (C++23)
alloziert Speicher in einer Größe, die mindestens der angeforderten Größe entspricht, über einen Allokator
(öffentliche statische Memberfunktion von std::allocator_traits<Alloc> )