Heim  >  Artikel  >  Backend-Entwicklung  >  Warum ist in C/C++ die Größe der Struktur nicht gleich der Summe der Größe jedes Mitglieds?

Warum ist in C/C++ die Größe der Struktur nicht gleich der Summe der Größe jedes Mitglieds?

PHPz
PHPznach vorne
2023-08-26 09:29:07819Durchsuche

Die Größe der durch

sizeof() erhaltenen Strukturtypelemente entspricht nicht immer der Größe jedes einzelnen Elements. Manchmal fügt der Compiler etwas Auffüllung hinzu, um Ausrichtungsprobleme zu vermeiden. Daher können sich die Abmessungen ändern. Polsterung wird hinzugefügt, wenn auf ein Strukturelement ein größeres Element folgt oder sich am Ende der Struktur befindet. Verschiedene Compiler haben unterschiedliche Arten von Ausrichtungseinschränkungen. Im C-Standard ist die gesamte Ausrichtungsstruktur von der Implementierung abhängig.

Fall 1

In diesem Fall ist das doppelte Z 8 Bytes lang, was größer als x (4 Bytes) ist. Es werden also weitere 4 Byte Auffüllung hinzugefügt. Darüber hinaus verfügen die Kurztypdaten y über 2 Byte Speicherplatz im Speicher, sodass zusätzliche 6 Byte als Auffüllung hinzugefügt werden.

Warum ist in C/C++ die Größe der Struktur nicht gleich der Summe der Größe jedes Mitglieds?

Beispielcode

#include <stdio.h>
struct myStruct {
   int x; //Integer takes 4 bytes, and padding 4 bytes
   double z; //Size of double is 8-byte, no padding
   short int y; //Size of short is 2-byte, padding 6-bytes
};
main() {
   printf("Size of struct: %d", sizeof(struct myStruct));
}

Ausgabe 2

Size of struct: 24

Fall 2

In diesem Fall wird zuerst das Double eingefügt, das 8 Byte Platz belegt. Jetzt wird die Ganzzahl x (4 Bytes) hinzugefügt. Es sind also noch 4 Byte Platz übrig. Nach dem Hinzufügen des kurzen Y kann es in weiteren 4 Bytes Platz abgelegt werden, was insgesamt 16 Bytes Platz einnimmt.

Warum ist in C/C++ die Größe der Struktur nicht gleich der Summe der Größe jedes Mitglieds?

Beispielcode

#include <stdio.h>
struct myStruct {
   double z; //Size of double is 8-byte, no padding
   int x; //Integer takes 4 bytes, and padding 4 bytes
   short int y; //Size of short is 2-byte, padding 6-bytes
};
main() {
   printf("Size of struct: %d", sizeof(struct myStruct));
}

Ausgabe 2

Size of struct: 16

Fall 3

Der dritte Fall belegt ebenfalls 16 Byte Speicherplatz, ist aber anders angeordnet. Da das erste Mitglied ein Double ist, wird es zuerst platziert und dann werden die Kurztypdaten hinzugefügt. Wenn nun versucht wird, eine Ganzzahl einzufügen, kann diese im verbleibenden 6-Byte-Bereich platziert werden. Daher gibt es nach dem Short ein Auffüllen, nach den Integer-Daten jedoch kein Auffüllen.

Warum ist in C/C++ die Größe der Struktur nicht gleich der Summe der Größe jedes Mitglieds?

Beispielcode

#include <stdio.h>
struct myStruct {
   double z; //Size of double is 8-byte, no padding
   short int y; //Size of short is 2-byte, padding 6-bytes
   int x; //Integer takes 4 bytes, and padding 4 bytes
};
main() {
   printf("Size of struct: %d", sizeof(struct myStruct));
}

Ausgabe 2

Size of struct: 16

Das obige ist der detaillierte Inhalt vonWarum ist in C/C++ die Größe der Struktur nicht gleich der Summe der Größe jedes Mitglieds?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:tutorialspoint.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen