Da this question si potrebbe iniziare a credere che l'allineamento di un'unione non sia inferiore al più grande allineamento dei suoi singoli membri. Ma ho un problema con il tipo long long
in gcc/g ++. L'esempio completo può essere trovato here, ma qui ci sono le parti rilevanti per la mia domanda:Perché l'allineamento del long union member è più grande del union/struct che lo contiene? È corretto?
union ull {
long long m;
};
struct sll {
long long m;
};
int main() {
#define pr(v) cout << #v ": " << (v) << endl
pr(sizeof(long long));
pr(__alignof__(long long));
pr(sizeof(ull));
pr(__alignof__(ull));
pr(sizeof(sll));
pr(__alignof__(sll));
};
Il risultato è il seguente output:
sizeof(long long): 8
__alignof__(long long): 8
sizeof(ull): 8
__alignof__(ull): 4
sizeof(sll): 8
__alignof__(sll): 4
Perché è l'allineamento di un membro di un'unione più grande di quella dell'unione contenente?
[UPDATE]
Secondo la risposta di Keith alignof è sbagliato qui. Ma provo quanto segue e sembra che l'allineamento ci dica il vero. Vedere:
union ull {
long long m;
};
long long a;
char b;
long long c;
char d;
ull e;
int main() {
#define pr(v) cout << #v ": " << (v) << endl
pr(size_t((void*)&b));
pr(size_t((void*)&c));
pr(size_t((void*)&d));
pr(size_t((void*)&e));
pr(size_t((void*)&c) - size_t((void*)&b));
pr(size_t((void*)&e) - size_t((void*)&d));
};
L'output:
size_t((void*)&b): 134523840
size_t((void*)&c): 134523848
size_t((void*)&d): 134523856
size_t((void*)&e): 134523860
size_t((void*)&c) - size_t((void*)&b): 8
size_t((void*)&e) - size_t((void*)&d): 4
Così, l'allineamento del long long
è 8 e l'allineamento di unione contenente long long
è 4 nei dati globali. Per ambito locale non posso testarlo poiché sembra che il compilatore sia libero di riorganizzare i dati locali, quindi questo trucco non funziona. Puoi commentare questo?
[/ UPDATE]
Vedo la stessa cosa su Red Hat, gcc 4.7.0 con '-m32', ma * non * con' -m64' (tutti '8's). – BoBTFish
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52023 un collegamento al bug gcc corrispondente per _Alignof (C11). –