2012-04-01 6 views
8

Używam Code :: Blocks IDE z kompilatorem GNU GCC.C/C++: Pakowanie lub dopełnianie danych w struct

struct test 
{ 
    char a; 
    char e; 
    char f; 
    char b; 
    char d; 
}; 

sizeof(test) powraca 5.

czytałem tej odpowiedzi: Why isn't sizeof for a struct equal to the sum of sizeof of each member?

Jak to się stało nie ma wyściółka po ostatnim char, tak że sizeof(test) powraca 6 lub 8? Jest jeszcze mnóstwo pytań, które mógłbym zadać po dodaniu short i int itd. Ale myślę, że to pytanie jest na razie dobre. Czy dopełnienie nie ułatwiłoby procesorowi pracy z strukturą?

Odpowiedz

10

Ustawienie char wynosi tylko 1, więc nie ma potrzeby, aby struktura była wyścielana w celu spełnienia większego wymogu wyrównania.

+0

OK, więc powiedzmy, że mój rozmiar słowa to 4 bajty. Załóżmy, że mam tablicę 'test stuff [1000]'. Mój procesor czyta pojedyncze "testowe" takie jak 'char-char-char-char char-pad-pad-pad'. Czy tablica w pamięci nie musi być również sformatowana w ten sposób? – newprogrammer

+0

@newprogrammer No. Będzie to 5000 bajtów, bez dopełnienia między elementami tablicy, członków struct. – asaelr

+0

@newprogrammer: W twojej strukturze nie ma "słów", więc dopasowanie do "słowa" nie ma znaczenia. –

1

Ponieważ w większości przypadków pracujesz z jednym członkiem na raz lub przekazujesz adres struktury, kompilator nie dba o wyrównanie całej struktury bardziej niż dostosowanie wymagane dla jej członków. Oznacza to, że jeśli przydzielisz tę strukturę (lub przekażesz ją do funkcji), procesor będzie musiał ją odczytać po członku. (i będzie trochę wolniej).