allineamento è una restrizione quale memoria posiziona primo byte di un valore può essere memorizzato . (È necessario migliorare le prestazioni sui processori e consentire l'uso di determinate istruzioni che funzionano solo su dati con allineamento particolare, ad esempio SSE deve essere allineato a 16 byte, mentre AVX a 32 byte.)
Allineamento di 16 significa che gli indirizzi di memoria multipli di 16 sono gli unici indirizzi validi. allineamento
alignas
forza al numero di byte richiesto (cppreference non ne parla, ma penso che si può allineare solo potenze di 2: 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);
}
output di esempio:
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
l'altra parola chiave
alignof
è molto conveniente, non si può fare qualcosa di simile
int a[4];
assert(a % 16 == 0); // check if alignment is to 16 bytes: WRONG compiler error
ma si può fare
01.235.
assert(alignof(a) == 16);
assert(alignof(b) == 1024);
nota che in realtà questo è più rigido di una semplice operazione "%" (modulo). In realtà sappiamo che qualcosa allineato a 1024 byte è necessariamente allineata a 1, 2, 4, 8 byte ma
assert(alignof(b) == 32); // fail.
Quindi, per essere più precisi, "alignof" restituisce il più grande potere di 2 a wich qualcosa è allineato .
Anche alignof è un buon modo per conoscere in anticipo il requisito di allineamento minimo per i tipi di dati di base (probabilmente restituirà 1 per char, 4 per float ecc.).
ancora legale:
alignas(alignof(float)) float SqDistance;
Qualcosa con un allineamento di 16 poi sarà posto sul prossimo indirizzo disponibile che è un multiplo di 16 (ci può essere un imbottitura implicita da ultimo indirizzo utilizzato).
cppreference sta cercando di essere un riferimento piuttosto che un tutorial – Cubbi
@Cubbi: puoi anche controllare su cplusplus.com, c'è dibattito su quale sito è migliore, per certi argomenti cplusplus è migliore, per altri cppreference è meglio, ho trovato che entrambi i siti certe volte non ci sono eonugh – GameDeveloper
@DarioOO Stavo solo rispondendo perché cppreference non spiega il concetto di allineamento sulla pagina 'alignof' (lo fa ora, sul work-in-progress [oggetto pagina] (http: //en.cppreference.com/w/cpp/language/object#Alignment)). Non vedo come cplusplus.com sia rilevante. – Cubbi