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