align (C++)
Specifici di Microsoft
utilizzo __declspec(align(#)) per con precisione controllare l'allineamento dei dati definiti dall'utente (ad esempio, allocazioni statiche o dati automatici in una funzione.
Per ulteriori informazioni sull'allineamento, vedere Allineamento di dati windows sull'IPF, su x86 e su x64.
__declspec( align( # ) ) declarator
Note
Le applicazioni di scrittura che utilizzano le ultime istruzioni del processore introduce nuovi vincoli e problemi.In particolare, molte nuove istruzioni richiedono che i dati vengano allineati su limiti di 16 byte.Inoltre, allineandoli i dati utilizzati di frequente alle dimensioni della riga della cache di un processore specifico, è possibile migliorare le prestazioni della cache.Ad esempio, se si definisce una struttura delle cui dimensioni sono minori di 32 byte, può essere opportuno allinearla a 32 byte per assicurarsi che gli oggetti del tipo di struttura da memorizzare nella cache in modo efficiente.
# è il valore di allineamento.Le voci valide sono potenze di due Integer 1 e 8192 (byte), ad esempio 2, 4, 8, 16, 32, o 64.declarator sono i dati che si sta dichiarando come allineato.
vedere __alignof per informazioni su come restituire un valore di tipo size_t questo è il requisito di allineamento del tipo.e __unaligned per informazioni su come dichiarare i puntatori non allineati quando si utilizzano i processore a 64 bit.
È possibile utilizzare __declspec(align(#)) quando si definisce un oggetto struct, union, o classoppure, quando si dichiara una variabile.
senza __declspec(align(#)), Visual C++ consente di allineare i dati sui limiti naturali in base alla dimensione dei dati, ad esempio Integer a 4 byte su limiti di 4 byte e 8 double byte su limiti di 8 byte.I dati in classi o strutture sono allineati all'interno della classe o di struttura al minimo dell'allineamento naturale e l'impostazione corrente di compressione (da utilizzare pack o /Zp opzione del compilatore).
Non è possibile specificare l'allineamento dei parametri di funzione.
Di seguito è riportato un esempio:
__declspec(align(32)) struct Str1{
int a, b, c, d, e;
};
Questo tipo dispone ora di un attributo di 32 allineamenti di byte, pertanto tutte le istanze necessario avviare in un limite di 32 byte.Tipi aggiuntivi della struttura dichiarati con questo tipo come membro mantengono questo attributo dell'allineamento del tipo, ovvero, una struttura con Str1 come elemento avrà un attributo di allineamento di almeno 32.
Per riepilogare:
A meno che l'applicazione con __declspec(align(#)), l'allineamento di un membro della struttura scalare è il minimo la dimensione e di compressione corrente.
A meno che l'applicazione con __declspec(align(#)), l'allineamento di una struttura è il massimo di singoli allineamenti dei relativi membri.
Un membro della struttura viene posizionato a un offset dall'inizio della struttura padre più piccolo multiplo dell'allineamento maggiore o uguale peroffset della fine del membro precedente.
La dimensione di una struttura è il più piccolo più del massimo maggiore di allineamento di o uguale l'offset della fine dell'ultimo membro.
si noti che sizeof(struct Str1) è uguale a 32, tale che, se una matrice di oggetti Str1 viene creata e la base della matrice è di 32 byte allineato, ogni membro della matrice verrà 32 byte allineato.Per creare una matrice i cui la base correttamente allineata, utilizzare _aligned_malloc, scrivere possiedono l'allocatore.Si noti che allocatori normali, ad esempio report, C++ operatore newe gli allocatori Win32 restituiscono la memoria che probabilmente sufficiente non verrà allineato per declspec(align(#)) strutture o matrici di strutture.
sizeof il valore di una struttura è l'offset del membro finale, nonché della dimensione del membro, arrotondate fino a più più del valore più grande di allineamento il membro o del valore di allineamento della struttura intera, qualsiasi è maggiore.
__declspec(align(#)) può solo aumentare le restrizioni di allineamento.
Per ulteriori informazioni, vedere:
allineare gli esempi
Definendo nuovi tipi con __declspec (align (#))
Allineare i dati nella memoria locale di thread
Come adattare Funziona con la compressione di dati
Esempi di allineamento di strutture (specifico per piattaforma x64)
allineare gli esempi
Negli esempi seguenti viene mostrato come __declspec(align(#)) influisce sulla dimensione e l'allineamento delle strutture dei dati.Gli esempi presuppongono le definizioni seguenti:
#define CACHE_LINE 32
#define CACHE_ALIGN __declspec(align(CACHE_LINE))
Nell'esempio seguente, S1 la struttura è definita con __declspec(align(32)).tutti gli utilizzi di S1, se per una definizione di variabile o altre dichiarazioni di tipo, verificare che tali dati della struttura sono 32 byte allineato.sizeof(struct S1) restituisce 32 e S1 dispone di 16 byte per aggiungere dopo i 16 byte necessari per utilizzare i quattro interi.ciascuno int il membro prevede l'allineamento di byte 4, mentre l'allineamento della struttura è dichiarato come 32, pertanto allineamento globale è 32.
struct CACHE_ALIGN S1 { // cache align all instances of S1
int a, b, c, d;
};
struct S1 s1; // s1 is 32-byte cache aligned
Nell'esempio seguente, sizeof(struct S2) restituirà 16, che è esattamente la somma delle dimensioni del membro, poiché questo è un multiplo di più grande requisito di allineamento (un multiplo di 8).
__declspec(align(8)) struct S2 {
int a, b, c, d;
};
Nell'esempio seguente, sizeof(struct S3) restituisce 64.
struct S3 {
struct S1 s1; // S3 inherits cache alignment requirement
// from S1 declaration
int a; // a is now cache aligned because of s1
// 28 bytes of trailing padding
};
Nell'esempio seguente, si noti che a ha solo l'allineamento di tipo naturale, in questo caso, 4 byte.tuttavia, S1 deve essere il 32 byte allineato.ventotto byte di riempimento seguono apertanto, s1 iniziare da offset 32.S4 quindi eredita il requisito di allineamento di S1, in quanto è più grande requisito di allineamento nella struttura.sizeof(struct S4) restituisce 64.
struct S4 {
int a;
// 28 bytes padding
struct S1 s1; // S4 inherits cache alignment requirement of S1
};
Le tre dichiarazioni delle variabili utilizzano inoltre __declspec(align(#)).In ogni caso, la variabile deve essere 32 byte allineato.Nel caso della matrice, l'indirizzo di base della matrice, non ogni membro della matrice, è di 32 byte allineato.sizeof il valore per ogni membro della matrice non verrà modificato mediante l'utilizzo di __declspec(align(#)).
CACHE_ALIGN int i;
CACHE_ALIGN int array[128];
CACHE_ALIGN struct s2 s;
Per allineare ogni membro specifico di una matrice, il codice seguente è opportuno utilizzare:
typedef CACHE_ALIGN struct { int a; } S5;
S5 array[10];
Nell'esempio seguente, si noti che allineare la struttura stessa e allineare il primo elemento sono identici:
CACHE_ALIGN struct S6 {
int a;
int b;
};
struct S7 {
CACHE_ALIGN int a;
int b;
};
S6 e S7 disporre di allineamento, l'allocazione e funzionalità identici di dimensione.
Nell'esempio seguente, l'allineamento degli indirizzi iniziali di a, b, la c e d sono 4, 1, 4 e 1, rispettivamente.
void fn() {
int a;
char b;
long c;
char d[10]
}
L'allineamento se la memoria è stata allocata nell'heap dipende dalla funzione di allocazione è denominata.Ad esempio, se si utilizzano malloc, il risultato dipende dalle dimensioni dell'operando.se argomento >= 8, allineamento verrà 8 byte allineato.se argomento < 8, allineamento verrà la prima potenza di 2 inferiore di un'unità argomento.Ad esempio, se si utilizza il report (7), allineamento è di 4 byte.
Definendo nuovi tipi con __declspec (align (#))
È possibile definire un tipo con una caratteristica di allineamento.
Ad esempio, è possibile definire un oggetto structcon un valore di allineamento come segue:
struct aType {int a; int b;};
typedef __declspec(align(32)) struct aType bType;
ora, aType e bType è la stessa dimensione (8 byte) ma le variabili di tipo bType essere 32 byte allineato.
Allineare i dati nella memoria locale di thread
L'archiviazione locale di thread statici (TLS) creata con __declspec(thread) attributo e inserito nella sezione di TLS funziona immagine per l'allineamento esattamente come i dati statici normali.Il sistema operativo crea i dati in TLS allocando i dati della dimensione della sezione di TLS e rispetto all'attributo di allineamento di sezione di TLS.
Nell'esempio seguente vengono mostrati vari modi per inserire i dati allineati in memoria locale di thread.
// put an aligned integer in TLS
__declspec(thread) __declspec(align(32)) int a;
// define an aligned structure and put a variable of the struct type
// into TLS
__declspec(thread) __declspec(align(32)) struct F1 { int a; int b; } a;
// create an aligned structure
struct CACHE_ALIGN S9 {
int a;
int b;
};
// put a variable of the structure type into TLS
__declspec(thread) struct S9 a;
Come adattare Funziona con la compressione di dati
/Zp opzione del compilatore e pack il pragma ha l'effetto dei dati di compressione per la struttura e i sindacalisti.In questo esempio viene illustrato come /Zp e __declspec(align(#)) lavoro raccolta:
struct S {
char a;
short b;
double c;
CACHE_ALIGN double d;
char e;
double f;
};
Nella tabella seguente sono elencati l'offset di ciascun membro nei vari /Zp (o #pragma pack) valori, per illustrare come i due interattivi.
Variabile |
/Zp1 |
/Zp2 |
/Zp4 |
/Zp8 |
---|---|---|---|---|
a |
0 |
0 |
0 |
0 |
b |
1 |
2 |
2 |
2 |
c |
3 |
4 |
4 |
8 |
d |
32 |
32 |
32 |
32 |
e |
40 |
40 |
40 |
40 |
f |
41 |
42 |
44 |
48 |
sizeof(S) |
64 |
64 |
64 |
64 |
Per ulteriori informazioni, vedere /Zp (Allineamento membri struct).
Pertanto, l'offset di un oggetto è basato sull'offset dell'oggetto precedente e l'impostazione corrente di compressione, a meno che l'oggetto dispone di un oggetto __declspec(align(#)) attributo, nel qual caso il valore di allineamento è basato sull'offset dell'oggetto precedente e __declspec(align(#))valore per l'oggetto.