Namensräume
Varianten
Aktionen

std::assume_aligned

Von cppreference.com
< cpp‎ | memory
 
 
Speicherverwaltungsbibliothek
(nur Exposition*)
Algorithmen für uninitialisierten Speicher
(C++17)
(C++17)
(C++17)
Beschränkte uninitialisierte
Speicher-Algorithmen
C-Bibliothek

Allocatoren
Speicherressourcen
Unterstützung für Garbage Collection
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
Uninitialisierter Speicher
Explizites Lebenszeitmanagement
 
Definiert in Header <memory>
template< std::size_t N, class T >
constexpr T* assume_aligned( T* ptr );
(seit C++20)

Informiert die Implementierung, dass das Objekt, auf das ptr zeigt, mindestens auf N ausgerichtet ist. Die Implementierung kann diese Information verwenden, um effizienteren Code zu generieren, darf diese Annahme jedoch nur treffen, wenn das Objekt über den Rückgabewert von assume_aligned zugegriffen wird.

N muss eine Zweierpotenz sein. Das Verhalten ist undefiniert, wenn ptr nicht auf ein Objekt des Typs T zeigt (ignoriert cv-Qualifikation auf jeder Ebene) oder wenn die Ausrichtung des Objekts nicht mindestens N beträgt.

Inhalt

[bearbeiten] Rückgabewert

ptr.

[bearbeiten] Ausnahmen

Wirft nichts.

[bearbeiten] Hinweise

Um sicherzustellen, dass das Programm von den durch assume_aligned aktivierten Optimierungen profitiert, ist es wichtig, auf das Objekt über dessen Rückgabewert zuzugreifen.

void f(int* p)
{
    int* p1 = std::assume_aligned<256>(p);
    // Use p1, not p, to ensure benefit from the alignment assumption.
    // However, the program has undefined behavior if p is not aligned
    // regardless of whether p1 is used.
}

Es obliegt dem Programm sicherzustellen, dass die Ausrichtungsannahme tatsächlich zutrifft. Ein Aufruf von assume_aligned bewirkt nicht, dass der Compiler dies überprüft oder erzwingt.

Feature-Test-Makro Wert Std Feature
__cpp_lib_assume_aligned 201811L (C++20) std::assume_aligned

[bearbeiten] Beispiel

[bearbeiten] Siehe auch

alignof (C++11) fragt nach Ausrichtungsanforderungen eines Typs
(Operator)[bearbeiten]
alignas (C++11) gibt an, dass der Speicher für die Variable um einen bestimmten Betrag ausgerichtet werden soll
(Spezifizierer)[bearbeiten]
(seit C++11)(veraltet in C++23)
definiert den Typ, der als uninitialisierter Speicher für Typen gegebener Größe geeignet ist
(Klassenvorlage) [bearbeiten]
(C++11)
richtet einen Zeiger in einem Puffer aus
(Funktion) [edit]
[[assume(ausdruck)]]
(C++23)
spezifiziert, dass der ausdruck an einer gegebenen Stelle immer zu true ausgewertet wird
(Attribut-Spezifizierer)[bearbeiten]