Heim >Backend-Entwicklung >C++ >Warum ist in C/C++ die Größe der Struktur nicht gleich der Summe der Größe jedes Mitglieds?
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.
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.
#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)); }
Size of struct: 24
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.
#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)); }
Size of struct: 16
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.
#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)); }
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!