2016-04-14 12 views
10

Ho dichiarato un'unione che alloca 4100 byte alla variabile "sample_union" e ha fatto la stessa dichiarazione di unione come parte di una struttura che alloca 4104 byte.Perché esiste una discrepanza nelle dimensioni tra strutture e unioni?

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 ; 

Posizionare l'unione sopra all'interno della struttura alloca 4104 byte.

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; 

Beh, questo non è un requisito di progetto, ma vorrei sapere perché il compilatore si comporta in modo diverso per questi due dichiarazione.

versione di gcc: (GCC) 4.9.2, x86_64

Piattaforma: Linux, x86_64

+0

Si noti che le strutture anonime non sono consentite dallo standard C++ (GCC lo fornisce come estensione). – user2079303

+0

Ecco quali sono le funzioni principali: int main (void) { printf ("size of sample_union =% d \ n", sizeof (sample_union)); printf ("dimensione di sample_struct =% d \ n", sizeof (sample_struct)); return 0; } uscita: dimensione sample_union = 4100 dimensione sample_struct = 4104 – user50

+1

@JoachimPileborg: La matrice è di tipo 'uint16_t [2048]', quindi occupa 4096 byte nella maggior parte delle macchine. – DarkDust

risposta

11

Quando avete l'unione all'interno della struct, non ha segnato il unione come packed. L'unione decompressa ha un piccolo riempimento (quattro byte) in modo che la sua dimensione sia un multiplo della dimensione di uint64_t.

L'unione imballata non ha questa imbottitura, quindi è più piccola.

Come osservazione a margine, la struttura anonima all'interno dell'unione non è contrassegnata packed. Ciò non importa in questo caso, perché tutto è comunque ben allineato, ma è qualcosa di cui essere consapevole.