Von this question könnte man anfangen zu glauben, dass die Ausrichtung einer Union nicht weniger als die größte Ausrichtung der einzelnen Mitglieder ist. Aber ich habe ein Problem mit dem long long
Typ in gcc/g ++. Das vollständige Beispiel kann here zu finden, aber hier sind die relevanten Teile für meine Frage:Warum ist das Ausrichten des langen langen Verbindungsglieds größer als dasjenige, das die Verbindung/Struktur enthält? Ist das richtig?
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));
};
Dieses in der folgenden Ausgabe führt:
sizeof(long long): 8
__alignof__(long long): 8
sizeof(ull): 8
__alignof__(ull): 4
sizeof(sll): 8
__alignof__(sll): 4
Warum ist die Ausrichtung eines Verbindungsteils größer als die von der enthaltenden Union?
[UPDATE]
Laut Keith Antwort alignof ist hier falsch. Aber ich teste das Folgende und es scheint, dass alignof uns die Wahrheit sagt. Siehe:
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));
};
Der Ausgang:
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
So ist die Ausrichtung von long long
8 und Ausrichtung der Union enthält long long
4 in globalen Daten. Für den lokalen Bereich kann ich das nicht testen, da es dem Compiler freisteht, lokale Daten neu anzuordnen - dieser Trick funktioniert also nicht. Kannst du das kommentieren?
[/ UPDATE]
Ich sehe das gleiche auf Red Hat, gcc 4.7.0 mit '-m32', aber * nicht * mit' -m64' (alle '8's). – BoBTFish
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52023 ein Link zum entsprechenden gcc-Bug für _Alignof (C11). –