2012-08-02 8 views
12

Zgodnie z moją wiedzą, Domyślnie wyrównanie 4-bajtowe zostanie wykonane. powiedziećdlaczego podszewka nie dzieje się w tym przypadku?

typedef struct 
{ 
    int data7; 
    unsigned char data8; 
    //3 -bytes will be added here. 
}Sample1; 

tak sizeof(Sample1) będzie 8.

Ale następującej strukturze, dlaczego wyściółka nie stało ?.

typedef struct 
{ 
    unsigned char data1; 
    unsigned char data2; 
    unsigned char data3; 
    unsigned char data4; 
    unsigned char data5; 
    unsigned char data6; 

}Sample2; 

Ale rozmiarof (Próbka2) wynosi tylko 6. Ta próbka2 nie jest strukturą z wyrównaniem 4 bajtów?

EDIT ::

Zgodnie Wiki

wyrównanie danych oznacza wprowadzanie danych w pamięci offsetowego równa jakiejś wielokrotności rozmiaru tekstu, co zwiększa wydajność systemu ze względu na sposób CPU obsługuje pamięć.

Ale członkowie Sample2 nie będą wyrównani w wielokrotności dwóch prawej?

Dzięki.

+2

dobre pytanie +1 – Angus

Odpowiedz

20

Żadne z pól w drugiej strukturze nie wymaga 4-bajtowego wyrównania. unsigned char wymaga tylko wyrównania 1-bajtowego. Dlatego nie ma potrzeby dopasowywania go do 4 bajtów.

Struktury są zwykle tylko wyrównane do maksymalnego wyrównania wszystkich pól.

+9

W celu edycji: To, że "rozmiar słowa" niekoniecznie musi być taki sam, jak natywny rozmiar słowa w procesorze. Jeśli typy danych są mniejsze, może mieć zastosowanie mniejszy rozmiar słowa. Na przykład, na x86, nie ma kary za wydajność dostępu do 'char' pod adresem' mod 4! = 0'. Ale będzie, jeśli spróbujesz uzyskać dostęp do czterobajtowego 'int' z' mod 4! = 0', ponieważ przekracza on 4-bajtową granicę wyrównania. – Mysticial

+1

Dzięki @Mystical. Bardzo potrzebna odpowiedź. Właśnie tego szukam. – Jeyaram

5

data7 jest pozycja 4-bajtowy, więc kompilator zwykle próbują wyrównać go na adres, który jest wielokrotnością 4.

data1 jest pozycja jeden bajt, więc kompilator nie będzie próbował dopasuj ją do jakiejś konkretnej granicy (tzn. nie przyniesie to rzeczywistego zysku).

3

Nie, w typowej implementacji Sample2 nie jest strukturą wyrównaną do 4 elementów. Jest to struktura wyrównana do 1 bajta.

W typowej realizacji wymóg wyrównania całej struktury jest obliczany jako maksymalnie wymogu wyrównania poszczególnych członków. To dlaczego Sample1 ma obowiązku wyrównania z int (4 na platformie), a Sample2 ma obowiązku wyrównania z unsigned char, czyli 1.

1

Char wymaga 1 bajt wyrównania. Maksymalny typ danych to char, , który jest wyrównany do jednego bajtu, a więc otrzymujesz rozmiar jako "6".

Możesz sprawdzić tę stronę, aby uzyskać więcej informacji. http://www.geeksforgeeks.org/archives/9705. Wyjaśnili to szczegółowo.

Powiązane problemy