Alignment Beschränkung ist, auf dem Speicher können einen Wert des ersten Byte-Positionen gespeichert werden, . (Es wird benötigt, um die Leistung von Prozessoren zu verbessern und die Verwendung bestimmter Befehle zuzulassen, die nur für Daten mit bestimmter Ausrichtung funktionieren, z. B. müssen SSE auf 16 Byte und AVX auf 32 Byte ausgerichtet werden.)
Ausrichtung von 16 bedeutet, dass Speicheradressen, die ein Vielfaches von 16 sind, die einzigen gültigen Adressen sind.
alignas
Kraft Ausrichtung auf die erforderliche Anzahl von Bytes (cppreference es nicht erwähnt, aber ich denke man nur Potenzen von 2 ausrichten: 1, 2, 4, 8, 16, 32, 64, 128,. ..)
#include <cstdlib>
#include <iostream>
int main() {
alignas(16) int a[4];
alignas(1024) int b[4];
printf("%p\n", a);
printf("%p", b);
}
Beispiel Ausgabe:
0xbfa493e0
0xbfa49000 // note how many more "zeros" now.
// binary equivalent
1011 1111 1010 0100 1001 0011 1110 0000
1011 1111 1010 0100 1001 0000 0000 0000 // every zero is just a extra power of 2
das andere Schlüsselwort
alignof
sehr bequem ist, können Sie nicht so etwas wie
int a[4];
assert(a % 16 == 0); // check if alignment is to 16 bytes: WRONG compiler error
tun, aber Sie können tun
assert(alignof(a) == 16);
assert(alignof(b) == 1024);
beachten Sie, dass dies in der Realität strenger als eine einfache "%" (Modulus) -Operation ist. In der Tat wissen wir, dass etwas auf 1024 Bytes ausgerichtet ist notwendigerweise auf 1 ausgerichtet, 2, 4, 8 Bytes aber
assert(alignof(b) == 32); // fail.
So genauer zu sein, „alignof“ liefert die größte Leistung von 2 bis weichen etwas ausgerichtete .
Auch alignof ist eine gute Möglichkeit, die Mindestausrichtung für grundlegende Datentypen im Voraus zu kennen (es wird wahrscheinlich 1 für Zeichen, 4 für Float usw. zurückgegeben).
noch legal:
alignas(alignof(float)) float SqDistance;
Etwas mit einer Ausrichtung von 16 wird dann auf die nächste verfügbare Adresse gelegt werden, die ein Vielfaches von 16 ist (es kann ein implizites padding von zuletzt benutzten Adresse sein).
cppreference versucht, eine Referenz statt ein Tutorial zu sein – Cubbi
@Cubbi: Sie können auch bei cplusplus.com überprüfen, gibt es Debatte, die Website ist besser, für bestimmte Themen cplusplus ist besser, für andere cppreference ist besser, fand ich dass beide Seiten bestimmte Zeiten sind nicht – GameDeveloper
@DarioOO Ich antwortete nur, warum cppreference nicht das Konzept der Ausrichtung auf der "alignof" Seite erklärt (es tut jetzt, auf der Work-in-Progress [Objektseite] (http: //en.cppreference.com/w/cpp/language/object#Alignment)). Ich sehe nicht, wie cplusplus.com relevant ist. – Cubbi