Ich versuche, die Größe dieses Structs in Bytes zu zählen und habe ein paar Fragen
struct stc {
int a;
int b;
char c;
union stc2 {
long a0;
int a1;
int a2;
};
char arr[10];
int z:2;
};
Ich überprüfe die Größe auf diese Weise:
int main(void) {
printf("%zu\n", sizeof(struct stc));
}
und kompiliere mit:
gcc -std=c99 -m32 -Wall -Wextra test.c
Es ist gcc 4.9 und ich benutze einen 64-Bit-Computer, aber ich möchte zuerst mit 32-Bit-Werten versuchen, so -m32. Jetzt ist das Ergebnis 20
, aber ich habe keine Ahnung warum. So zähle ich:
struct stc {
int a; // +4 = 4
int b; // +4 = 8
char c; // +1 aber danach long, also +4 (Alignment) = 12
union stc2 {
long a0; // +4 = 16
int a1;
int a2;
};
char arr[10]; // +8 (für arr[8]) und 2 Bits übrig = 24 (oder 28)
int z:2; // +4 = 28 (oder 32)
// Ich bin mir nicht sicher, wie es mit den 2 Bits vom Char-Array
// und 2 Bits vom Int funktionieren wird, daher zähle ich 2 verschiedene Werte.
};
Das war seltsam, also habe ich versucht, das herauszufinden und ich weiß, dass diese Union anscheinend die Größe 0 hat.
struct stc {
union stc2 {
long a0;
int a1;
int a2;
};
sizeof(struct stc) == 0
. Ich denke, das liegt an Compiler-Optimierung? Wenn ja, wie schaltet man sie aus? Wenn nicht, warum ist das so? Eine weitere Frage ist natürlich, wie man die Größe dieses Structs richtig zählt (mit oder ohne Optimierung) und warum die Größe dieses einfachen Structs:
struct stc {
char arr[10];
};
10 beträgt und nicht 12. Ich dachte, dass jeder Wert auf 4, 8, 12, 16, 20 usw. ausgerichtet ist, wenn man dem Compiler nicht sagt, Werte nicht auszurichten.