Die Ausrichtung ist eine Einschränkung, an welchen Speicherpositionen das erste Byte eines Werts gespeichert werden kann. (Es ist erforderlich, um die Leistung auf Prozessoren zu verbessern und die Verwendung bestimmter Anweisungen zu ermöglichen, die nur für Daten mit bestimmter Ausrichtung funktionieren. Beispielsweise muss SSE auf 16 Byte und AVX auf 32 Byte ausgerichtet sein.)
Die Ausrichtung von 16 bedeutet, dass Speicheradressen, die ein Vielfaches von 16 sind, die einzigen gültigen Adressen sind.
alignas
Erzwinge die Ausrichtung auf die erforderliche Anzahl von Bytes. Sie können nur Potenzen von 2: 1, 2, 4, 8, 16, 32, 64, 128, ... ausrichten.
#include <cstdlib>
#include <iostream>
int main() {
alignas(16) int a[4];
alignas(1024) int b[4];
printf("%p\n", a);
printf("%p", b);
}
Beispielausgabe:
0xbfa493e0
0xbfa49000
1011 1111 1010 0100 1001 0011 1110 0000
1011 1111 1010 0100 1001 0000 0000 0000
das andere Schlüsselwort
alignof
ist sehr praktisch, so etwas kann man nicht machen
int a[4];
assert(a % 16 == 0);
aber du kannst es tun
assert(alignof(a) == 16);
assert(alignof(b) == 1024);
Beachten Sie, dass dies in Wirklichkeit strenger ist als eine einfache "%" -Operation (Modul). Tatsächlich wissen wir, dass etwas, das auf 1024 Bytes ausgerichtet ist, notwendigerweise auf 1, 2, 4, 8 Bytes ausgerichtet ist, aber
assert(alignof(b) == 32);
Genauer gesagt gibt "alignof" die größte Potenz von 2 zurück, um etwas auszurichten.
Alignof ist auch eine gute Möglichkeit, die Mindestausrichtungsanforderungen für grundlegende Datentypen im Voraus zu kennen (wahrscheinlich wird 1 für Zeichen, 4 für Float usw. zurückgegeben).
Immer noch legal:
alignas(alignof(float)) float SqDistance;
Etwas mit einer Ausrichtung von 16 wird dann auf die nächste verfügbare Adresse gesetzt, die ein Vielfaches von 16 ist (es kann eine implizite Auffüllung von der zuletzt verwendeten Adresse geben).