Namespaces
Variants

std:: assume_aligned

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)
Definiert im Header <memory>
template < std:: size_t N, class T >
constexpr T * assume_aligned ( T * ptr ) ;
(seit C++20)

Teilt der Implementierung mit, 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 auf 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 vom Typ T zeigt (unter Ignorierung von cv-Qualifizierern auf jeder Ebene), oder wenn die Ausrichtung des Objekts nicht mindestens N beträgt.

Inhaltsverzeichnis

Rückgabewert

ptr .

Exceptions

Wirft nichts.

Hinweise

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

void f(int* p)
{
    int* p1 = std::assume_aligned<256>(p);
    // Verwenden Sie p1, nicht p, um von der Ausrichtungsannahme zu profitieren.
    // Das Programm hat jedoch undefiniertes Verhalten, wenn p nicht ausgerichtet ist,
    // unabhängig davon, ob p1 verwendet wird.
}

Es liegt in der Verantwortung des Programms sicherzustellen, dass die Ausrichtungsannahme tatsächlich zutrifft. Ein Aufruf von assume_aligned veranlasst den Compiler nicht, dies zu überprüfen oder durchzusetzen.

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

Beispiel

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 werden soll
(Spezifizierer)
(since C++11) (deprecated in C++23)
definiert den Typ, der als nicht initialisierter Speicher für Typen gegebener Größe geeignet ist
(Klassentemplate)
(C++11)
richtet einen Zeiger in einem Puffer aus
(Funktion)
[[ assume ( expression )]]
(C++23)
spezifiziert, dass der Ausdruck an einem gegebenen Punkt immer zu true ausgewertet wird
(Attribut-Spezifizierer)