2009-03-10 10 views
5

Jestem ciekawy, dlaczego pola bitowe z tym samym typem danych zajmują mniejszy rozmiar niż w przypadku mieszanych typów danych .dlaczego pola bitowe dla tych samych typów danych mają mniejszy rozmiar w porównaniu do pól bitowych dla typów danych mieszanki

struct xyz 
{ 
    int x : 1; 
    int y : 1; 
    int z : 1; 
}; 


struct abc 
{ 
    char x : 1; 
    int y : 1; 
    bool z : 1; 
}; 

sizeof (xyz) = 4 sizeof (abc) = 12.

używam VS 2005, maszyna 64-bit x86.

Odpowiedź bitowa na poziomie kompilatora/kompilatora byłaby świetna.

Odpowiedz

4

Wyrównanie.

Twój kompilator dostosuje zmienne w sposób odpowiedni dla Twojej architektury. W twoim przypadku, char, int i bool mają różne rozmiary, więc będą przechodzić przez te informacje, a nie wskazówki dotyczące bitów.

W tej sprawie odbyła się dyskusja w numerze this question.

Rozwiązaniem jest przekazanie do kompilatora dyrektyw #pragma lub __attributes__ w celu poinformowania go o zignorowaniu optymalizacji dopasowania.

+1

Należy zauważyć, że pola bitowe nie mają jednak wymagań dotyczących wyrównania. –

+0

Nie, ale kompilator nie ma obowiązku ich pakowania. – greyfade

+0

Patrz ISO14882: 2003, §9.6, akapit 1. – greyfade

3

Standard C (1999 wersja, §6.7.2.1, strona 102, pkt 10) mówi tak:

implementacja może przeznaczyć dowolną adresowalny moduł pamięci na tyle duże, aby pomieścić nieco-field . Jeśli pozostanie wystarczająca ilość miejsca, pole bitowe, które bezpośrednio następuje po innym polu bitowym w strukturze, zostanie zapakowane w sąsiednie bity tego samego urządzenia.

Wygląda na to, że nie ma żadnych sformułowań, które mogłyby wpłynąć na pakowanie w zależności od rodzaju pól. W związku z tym stwierdziłbym, że jest to błąd kompilatora.

gcc tworzy 4-bajtową strukturę w obu przypadkach, na komputerze zarówno 32-bitowym, jak i 64-bitowym, pod Linuksem. Nie mam VS i nie mogę tego przetestować.

+1

C++ 03, §9.6, paragraf 1 mówi: "Przydział pól bitowych w obiekcie klasy jest definiowany przez implementację Dopasowywanie pól bitowych jest definiowane przez implementację Pola bitów są pakowane do jakiejś adresowalnej jednostki alokacji." Wygląda na to, że mahesh używa kompilatora C++. – greyfade

+0

Z drugiej strony, oznaczył to również jako pytanie C, a nie tylko C++. Myślę, że odpowiedź jest inna dla C i C++. –

+0

Byłbym nieufny wobec twierdzenia, że ​​jest to "błąd", ponieważ cytowałeś standard ISO C99. MSVC++ nie rości sobie prawa do przestrzegania C99. Obsługuje ISO C90/ANSI C89. – Clifford

0

Jest to błędny kompilator lub błąd w kodzie. Wszystkie bity przypisane do struktury zawsze starają się określić maksymalny najwyższy typ danych. np. W struct xyz sizeof najwyższy typ danych to 4 tj. Int. W podobny sposób dla drugiej struktury abc najwyższy typ danych wynosi 4 dla int.

Jeśli zmienimy zmienne struktury następująco: struct abc { char a: 1; char b: 1; bool c: 1; };

sizeof (abc) będzie 1 nie 4. Ponieważ rozmiar najwyższy typ danych wynosi 1, a wszystkie bity mieszczą się w 1 bajcie znaku.

Różne testy można wykonać, zmieniając typ danych w strukturze.

link do wyjścia na podstawie starej struktury: Odwiedź http://codepad.org/6j5z2CEX

link do wyjścia na podstawie powyższej struktury zdefiniowanej przeze mnie: Odwiedź http://codepad.org/fqF9Ob8W

Aby uniknąć takich problemów sizeof struktur będziemy właściwie pakują struktur korzystania Makro #pragma pack.

Powiązane problemy