Heim > Backend-Entwicklung > C++ > Hauptteil

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

PHPz
Freigeben: 2023-08-26 09:29:07
nach vorne
841 Leute haben es durchsucht

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));
}
Nach dem Login kopieren

Ausgabe 2

Size of struct: 24
Nach dem Login kopieren

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));
}
Nach dem Login kopieren

Ausgabe 2

Size of struct: 16
Nach dem Login kopieren
Nach dem Login kopieren

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));
}
Nach dem Login kopieren

Ausgabe 2

Size of struct: 16
Nach dem Login kopieren
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:tutorialspoint.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage