Ich weiß nicht, wo Sie die Idee über char
oder int
als "8 Bytes" berechnet bekommen. Nein, jeder Typ wird entsprechend seiner Größe berechnet: char
als 1, int
als 4 auf einer 32-Bit-Plattform (nicht 8, sondern 4). Die Ausrichtungsanforderung für jeden Typ ist normalerweise die gleiche wie seine Größe (obwohl dies nicht notwendig ist).
Aus diesem Grund, wenn die Struktur der Mitglieder des gleichen Typ enthält, wird in der Regel die Gesamtgröße dieser Struktur die genaue Summe der Größen ihrer Mitglieder sein: eine Struktur von 3 char
s wird 3 haben eine Größe und die Struktur von zwei int
s wird Größe 8 haben.
Offenbar Typ short
auf Ihrer Plattform hat Größe 2, so erwartet, eine Struktur von 3 Shorts hat Größe 6, die genau das ist, was Sie beobachten.
Wenn Ihre Struktur jedoch Mitglieder verschiedene Typen enthält, kommt der Unterschied zwischen Ausrichtungsanforderungen verschiedener Typen ins Spiel. Wenn die Ausrichtungsanforderung des nächsten Felds strenger ist als die Ausrichtungsanforderung des vorherigen Felds, muss der Compiler zwischen diesen Feldern möglicherweise einige Füllbytes hinzufügen (um das nächste Element richtig auszurichten), was sich auf die endgültige Größe der Struktur auswirkt. Außerdem muss der Compiler nach dem letzten Element der Struktur möglicherweise einige zusätzliche Füllbytes hinzufügen, um die Ausrichtungsanforderungen in einem Array zu erfüllen.
Zum Beispiel einer Struktur, die
struct S {
char c;
int i;
};
wird höchstwahrscheinlich besetzen 8 Bytes auf Ihrer Plattform wegen der Notwendigkeit, für 3 Paddingbytes nach dem char
Mitglied wie folgt aussieht. Man beachte, char
zählt als 1, int
als 4 und die zusätzlichen 3 Füllbytes zwischen ihnen machen es 8.
beachte auch, dass dies leicht die Abhängigkeit der endgültigen Größe der Struktur in der Größenordnung einführen könnte, in denen die Mitglieder erklärt. Zum Beispiel diese Struktur
struct S1 {
char c1;
int i;
char c2;
};
auf Ihrer Plattform wird wahrscheinlich Größe 12, während diese ein
struct S2 {
int i;
char c1;
char c2;
};
nur 8 Bytes besetzen. Dieses letzte Beispiel soll veranschaulichen, dass die endgültige Größe der Struktur nicht ausgedrückt werden kann in Bezug darauf, wie viele Bytes jedes Mitglied "zählt". Die Beziehungen zwischen den Mitgliedern sind ebenfalls wichtig.
Es ist nicht, dass ich eine bestimmte Ausrichtung möchte, es ist nur, dass ich, dass die 4-Byte-Ausrichtung immer auf 32-Bit-Architekturen eingehalten wurde –
Wenn nur! Es würde sicherlich viel einfacher machen, Speicherzuweiser zu schreiben ...Leider kann sich die Ausrichtung von einem Typ zum anderen unterscheiden, und es gibt keinen portablen Weg, den Compiler nach der bestimmten Ausrichtung eines bestimmten Typs zu fragen, obwohl es Tricks gibt. –
'#define alignof (type) ((char *) & ((struct {char dummy; typ x;} *) 0) -> x - (char *) 0)' –