Beste Antwort
Die genaue Reihenfolge sizeof(struct)
ist ein Kompilierungsfehler Ich nehme an, Sie fragen, wie Sie die Größe eines bestimmten struct
bestimmen.
Diese Antwort lautet und wird von der C-Sprachdefinition nicht direkt bereitgestellt. Es ist vielmehr eine Funktion des ABI für Ihre spezielle Zielarchitektur. (ABI steht für Application Binary Interface.)
Der C-Sprachstandard enthält einige allgemeine Regeln. Wenn Sie beispielsweise eine struct
mit mehreren Mitgliedern haben, teilt das erste Mitglied eine Adresse mit der struct
selbst und nachfolgende Mitglieder an höheren Adressen sein.
Bitfelder haben ihre eigenen Regeln. Ich werde sie hier nicht rekapitulieren.
Bei einer ersten Bestellung beträgt die Größe eines struct
mindestens so groß wie die Summe der Größe seiner Mitglieder (Bitfelder werden im Moment ignoriert). Mitglieder können Ausrichtungsbeschränkungen haben, und wenn dies der Fall ist, kann die Umgebung am Ende des struct
Auffüllen zwischen Mitgliedern und Auffüllen einführen id = „a3303ac3a0″>
in einer Architektur, die eine 8-Byte-Ausrichtung für double
-Werte erfordert:
struct fun {
char a;
double b;
char c;
};
Nach den Regeln der C-Sprache b
muss in jedem Fall von struct fun
an einer höheren Adresse als a
sein. Ebenso muss sich c
an einer höheren Adresse befinden als b
.
Infolgedessen wird diese bestimmte Struktur wahrscheinlich belegt 24 Bytes aufgrund der Ausrichtungsbeschränkungen für b
in dieser Architektur. Dieselbe Struktur erfordert möglicherweise nur 16 Byte in einer Architektur, die nur eine 4-Byte-Ausrichtung für double
erfordert.
Glauben Sie mir nicht?
Überzeugen Sie sich selbst:
Letztendlich müssen Sie den ABI Ihrer Zielplattform konsultieren, um zu verstehen, wie eine struct
wird für dieses -Ziels zusammengepackt.
Oder verwenden Sie einfach sizeof
wenn es Sie persönlich nicht wirklich interessiert, aber Ihr Code muss sich darum kümmern.
Antwort
Wie berechne ich? Der Wert von sizeof (struct) in C?
Sie tun es nicht. Der Compiler tut dies.
Zunächst einmal ist sizeof(struct)
ein Syntaxfehler. Sie fragen sich wahrscheinlich, wie Sie die Größe eines Strukturtyps oder eines Objekts eines solchen Typs bestimmen können. Es ist wichtig, genau zu sein. (Ich verstehe, dass Quoras Entfernen von Fragendetails dies schwierig macht.)
Angenommen, Sie haben einen Strukturtyp mit dem Namen struct foo
und / oder ein Objekt dieses Typs mit dem Namen obj
. Die Größe des Typs ist sizeof (struct foo)
und die Größe des Objekts (die der Größe seines Typs entspricht) ist sizeof foo
. (Die Klammern sind im ersten Fall und nicht im zweiten erforderlich. Es gibt tatsächlich zwei verschiedene Formen des Operators sizeof
. Eine wird auf einen Typnamen in Klammern angewendet, die andere auf einen Ausdruck, der häufig, aber nicht immer ein Objektname ist.)
Sie denken möglicherweise, dass Sie die Größe einer Struktur berechnen können, indem Sie die Größen ihrer Elemente addieren. Das kannst du nicht. Compiler können und führen Auffüllungen zwischen Elementen und möglicherweise nach dem letzten Element ein, um die Ausrichtungsanforderungen zu erfüllen. Die Größe einer Struktur ist mindestens die Summe der Größen ihrer Elemente. Wenn Sie jedoch die Größe der gesamten Struktur benötigen, verwenden Sie einfach sizeof
. Dafür ist es da.