2016-04-14 11 views
10

Ich habe eine Union, die der Variablen "sample_union" 4100 Bytes zuweist, deklariert und die gleiche Vereinigungsdeklaration als Teil einer Struktur gemacht, die 4104 Bytes zuweist.Warum gibt es eine Größenabweichung zwischen Strukturen und Gewerkschaften?

union test_size_union { 
    struct { 
     uint8_t type; 
     union { 
      uint8_t count; 
      uint8_t list; 
     }; 
     uint16_t rc; 
     uint16_t arr_value[2048]; 
    }; 
    uint64_t first_dword; 
}__attribute__((packed)) sample_union ; 

Platzieren der obigen Union innerhalb der Struktur ist 4104 Bytes zuordnen.

struct test_size_struct { 
    union { 
     struct { 
      uint8_t type; 
      union { 
       uint8_t count; 
       uint8_t list; 
      }; 
      uint16_t rc; 
      uint16_t arr_value[2048]; 
     }; 
     uint64_t first_dword; 
    }; 
}__attribute__((packed)) sample_struct; 

Nun, das ist keine Projektanforderung, aber ich würde gerne wissen, warum Compiler anders für diese beide Erklärung verhält.

gcc-Version: (GCC) 4.9.2, x86_64

Plattform: Linux, x86_64

+0

Beachten Sie, dass anonyme Strukturen vom C++ - Standard nicht zugelassen sind (GCC stellt es als Erweiterung bereit). – user2079303

+0

Das, was Hauptfunktionen tut: Int Haupt (void) { printf ("Größe von Beispiel_union =% d \ n", sizeof (Beispiel_union)); printf ("size of sample_struct =% d \ n", sizeof (sample_struct)); Rückgabe 0; } output: Größe sample_union = 4100 Größe sample_struct = 4104 – user50

+1

@JoachimPileborg: Das Array vom Typ 'uint16_t [2048]', so nimmt bis 4096 Bytes auf den meisten Maschinen. – DarkDust

Antwort

11

Wenn Sie die Union innerhalb der Struktur gelegt, nicht wahr markieren die Vereinigung als packed. Die entpackte Union hat eine kleine Auffüllung (vier Bytes), so dass ihre Größe ein Vielfaches der Größe von uint64_t ist.

Die gepackte Union hat diese Polsterung nicht, also ist sie kleiner.

Als eine Nebenbeobachtung ist die anonyme Struktur innerhalb der Union nicht markiert packed. Das spielt in diesem Fall keine Rolle, denn alles ist trotzdem gut ausgerichtet - aber es ist etwas, dessen man sich bewusst sein muss.

Verwandte Themen