std:: align
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Definiert im Header
<memory>
|
||
|
void
*
align
(
std::
size_t
alignment,
std::
size_t
size,
|
(seit C++11) | |
Gegeben einen Zeiger ptr auf einen Puffer der Größe space , gibt einen Zeiger zurück, der an der spezifizierten alignment für size Bytes ausgerichtet ist, und verringert das space Argument um die Anzahl der für die Ausrichtung verwendeten Bytes. Die erste ausgerichtete Adresse wird zurückgegeben.
Die Funktion modifiziert den Zeiger nur, wenn es möglich wäre, die gewünschte Anzahl von Bytes, ausgerichtet an der gegebenen Alignment, in den Puffer einzupassen. Wenn der Puffer zu klein ist, tut die Funktion nichts und gibt nullptr zurück.
Das Verhalten ist undefiniert, wenn alignment keine Zweierpotenz ist.
Inhaltsverzeichnis |
Parameter
| alignment | - | die gewünschte Ausrichtung |
| size | - | die Größe des auszurichtenden Speichers |
| ptr | - |
Zeiger auf zusammenhängenden Speicher (einen Puffer) von mindestens
space
Bytes
|
| space | - | die Größe des Puffers, in dem operiert wird |
Rückgabewert
Der angepasste Wert von ptr oder ein Nullzeigerwert, falls der bereitgestellte Speicherplatz zu klein ist.
Beispiel
Demonstriert die Verwendung von
std::align
zur Platzierung von Objekten unterschiedlichen Typs im Speicher.
#include <iostream> #include <memory> #include <new> template<std::size_t N> struct MyAllocator { std::byte data[N]; std::size_t sz{N}; void* p{data}; MyAllocator() = default; // Note: only well-defined for implicit-lifetime types template<typename T> T* implicit_aligned_alloc(std::size_t a = alignof(T)) { if (std::align(a, sizeof(T), p, sz)) { T* result = std::launder(reinterpret_cast<T*>(p)); p = static_cast<std::byte*>(p) + sizeof(T); sz -= sizeof(T); return result; } return nullptr; } }; int main() { MyAllocator<64> a; std::cout << "allocated a.data at " << (void*)a.data << " (" << sizeof a.data << " bytes)\n"; // Allocate a char if (char* p = a.implicit_aligned_alloc<char>()) { *p = 'a'; std::cout << "allocated a char at " << (void*)p << '\n'; } // Allocate an int if (int* p = a.implicit_aligned_alloc<int>()) { *p = 1; std::cout << "allocated an int at " << (void*)p << '\n'; } // Allocate an int, aligned at a 32-byte boundary if (int* p = a.implicit_aligned_alloc<int>(32)) { *p = 2; std::cout << "allocated an int at " << (void*)p << " (32-byte alignment)\n"; } }
Mögliche Ausgabe:
allocated a.data at 0x7ffc654e8530 (64 bytes) allocated a char at 0x7ffc654e8530 allocated an int at 0x7ffc654e8534 allocated an int at 0x7ffc654e8540 (32-byte alignment)
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 2377 | C++11 |
alignment
musste ein fundamentaler oder unterstützter erweiterter Ausrichtungswert sein
|
muss nur eine Zweierpotenz sein |
Siehe auch
alignof
(C++11)
|
fragt die Ausrichtungsanforderungen eines Typs ab
(Operator) |
alignas
(C++11)
|
spezifiziert, dass der Speicher für die Variable um einen bestimmten Betrag ausgerichtet sein soll
(Spezifizierer) |
|
(seit C++11)
(veraltet in C++23)
|
definiert den Typ, der als nicht initialisierter Speicher für Typen gegebener Größe geeignet ist
(Klassentemplate) |
|
(C++20)
|
informiert den Compiler, dass ein Zeiger ausgerichtet ist
(Funktionstemplate) |