none
Aus der MSDN-Entwickler-Hotline: Können anonyme Strukturen das Speicherlayout der umgebenden Struktur verändern? RRS feed

  • Allgemeine Diskussion

  • Hallo zusammen,
    heute wurde uns bei der MSDN-Entwickler-Hotline unter anderem folgende Frage gestellt:

    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
    MSDN-Entwickler-Hotline: Schnelle & kompetente Hilfe für Entwickler: kostenfrei!

    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 .

    Mittwoch, 3. Dezember 2014 16:19

Alle Antworten

  • Hallo Tobias K.,

    Vielen Dank für das aufschlussreiche Verfahren, das Sie mitgeteilt haben.

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Donnerstag, 4. Dezember 2014 15:20
    Administrator