Können anonyme Strukturen das Speicherlayout der umgebenden Struktur verändern?
Unsere Antwort bzw. unser Lösungsvorschlag darauf war:
Um Variablen innerhalb von Strukturen zu gruppieren, können anonyme Strukturen verwendet werden:
struct test
{
struct
{
int i;
char c1;
} gruppe;
char c2;
};
...
// Zugriff erfolgt wie erwartet:
test t;
t.c2 = 'a';
t.s.i = 42;
Fraglich ist nun, ob die Gruppierung mittels anonymen Strukturen das Speicherlayout verändert und so zum Beispiel mehr Speicherplatz verbraucht?
Betrachten wir dazu die Struktur "test_plain":
struct test_plain
{
int i
char c1;
char c2;
};
Beide enthalten die gleichen Primitiven Member. Trotzdem verbrauchen sie unterschiedlich viel Speicherplatz:
sizeof(test) = 12
sizeof(test_plain) = 8
Das kommt daher, dass der Kompiler zusätzliche Speicherbereiche für Padding
[1]einfügt. "test_plain" benötigt hierbei 4 Byte für i, 1 Byte für c1, 1 Byte für c2 und 2 Byte Padding, um die Größe der Struktur an einem Vielfachen von 4 ausrichten zu können. "test" hingegen hat zunächst die anonyme Struktur: 4 Byte
für i, 1 byte für c1 und mit weiteren 3 Byte wird die anonyme Struktur an einem Vielfachen von 4 ausgerichtet. Damit benötigt die anonyme Struktur selber schon 8 Byte. Dann kommt noch c2 mit einem Byte hinzu und weitere 3 Byte für Padding.
An sich ist das nicht schlimm. Möchte man aber unbedingt Speicherplatz sparen, kann man #pragma pack
[2] verwenden. Damit ist es sogar möglich die Größe beider Strukturen auf 6 Byte zu drücken
[1] http://en.wikipedia.org/wiki/Data_structure_alignment
[2] http://msdn.microsoft.com/de-DE/library/2e70t5y1.aspx
Wir hoffen, vielen Besuchern der
MSDN Foren durch das Posten dieses Problems und einer möglichen Lösung weiterhelfen zu können.
Viele Grüße,
Tobias K.
Entwickler-Hotline für MSDN Online Deutschland
Disclaimer:
Bitte haben Sie Verständnis dafür, dass wir hier auf Rückfragen gar nicht oder nur sehr zeitverzögert antworten können.
Bitte nutzen Sie für Rückfragen oder neue Fragen den telefonischen Weg über die MSDN-Entwickler-Hotline:
http://www.msdn-online.de/Hotline
Es gelten für die MSDN-Entwickler-Hotline und dieses Posting diese Nutzungsbedingungen
, Hinweise zu Markenzeichen,
Informationen zur Datensicherheit
sowie die gesonderten
Nutzungsbedingungen für die MSDN-Entwickler-Hotline .