2010-01-15 15 views
6
  • Czy bitfield to koncepcja C, czy C++?Pytania dotyczące pól bitowych C

  • Czy można go używać tylko w obrębie struktury? Jakie są inne miejsca, z których możemy skorzystać?

  • AFAIK, bitfieldy są specjalnymi zmiennymi struktury, które zajmują pamięć tylko dla określonego nr. bitów. Jest to przydatne w oszczędzaniu pamięci i niczym więcej. Czy mam rację?

I kodowane mały program, aby zrozumieć wykorzystanie bitfields - Ale myślę, że to nie działa zgodnie z oczekiwaniami. Oczekuję, że rozmiar poniższej struktury będzie 1 + 4 + 2 = 7 bajtów (biorąc pod uwagę rozmiar niepodpisanego int to 4 bajty na mojej maszynie), ale ku mojemu zaskoczeniu okazuje się, że jest to 12 bajtów (4 + 4 + 4). Czy ktoś może mi powiedzieć, dlaczego?

#include <stdio.h> 

struct s{ 
unsigned int a:1; 
unsigned int b; 
unsigned int c:2; 
}; 

int main() 
{ 
    printf("sizeof struct s = %d bytes \n",sizeof(struct s)); 
    return 0; 
} 

WYJŚCIE:

sizeof struct s = 12 bytes 

Odpowiedz

10

Ponieważ a i c nie są ciągłe, każdy z nich zarezerwować full int warto przestrzeni pamięci. Jeśli przeniesiesz razem a i c, rozmiar struktury stanie się 8 bajtów.

Co więcej, mówisz kompilatorowi, że chcesz zajmować tylko 1 bit, a nie 1 bajt. Tak więc, mimo że a i c obok siebie powinny zajmować tylko 3 bity (wciąż pod jednym bajtem), kombinacja a i c nadal staje się wyrównana do słowa w pamięci na komputerze 32-bitowym, a więc zajmuje pełne 4 bajty oprócz int b.

Podobnie, należy zauważyć, że

struct s{ 
unsigned int b; 
short s1; 
short s2; 
}; 

zajmuje 8 bajtów, podczas gdy

struct s{ 
short s1; 
unsigned int b; 
short s2; 
}; 

zajmuje 12 bajtów, ponieważ w tym ostatnim przypadku, dwa szorty każdy siedzieć we własnym ustawieniu 32-bitowego .

6

1) Pochodzą one z C, ale są również częścią C++, niestety.

2) Tak, lub w klasie w C++.

3) Poza zapamiętywaniem pamięci, mogą być używane również w niektórych odmianach twiddling. Jednak zarówno oszczędzanie pamięci, jak i twiddling są z natury zależne od implementacji - jeśli chcesz pisać oprogramowanie przenośne, unikaj pól bitowych.

+0

Do niższego - którego z tych stwierdzeń nie zgadzasz? –

+0

+1: Kluczem są "zależne od implementacji" i "unikaj bitfieldów". –

+0

Częściowo się nie zgadzam w odniesieniu do oszczędności pamięci: nie krępuj się określać pola bitów, w których mogą zmniejszyć ślad pamięci struktury. Ale nigdy nie staraj się być z nimi sprytny i siedmiokrotnie nie licz na to, co zrobi kompilator. – dmckee

0

Jego C.

Twój comiler ma zaokrąglone alokacji pamięci do 12 bajtów dla celów wyrównania. Większość syubsystemów pamięci komputerowej nie obsługuje adresowania bajtowego.

+0

masz na myśli "bitowe adresowanie", prawda? – SoapBox

0

Twój program działa dokładnie tak, jak się spodziewałam. Kompilator przydziela sąsiednie pola bitowe do tego samego słowa pamięci, ale twoje są oddzielone przez inne niż bitfield.

Przenieś pola bitowe obok siebie i prawdopodobnie uzyskasz 8, co jest wielkością dwóch int na twoim komputerze. Pola bitowe zostaną spakowane w jedną int. Jest to jednak specyficzne dla kompilatora.

Bitfields są przydatne do oszczędzania miejsca, ale nie wiele więcej.

0

Bitfields są szeroko stosowane w oprogramowaniu układowym do mapowania różnych pól w rejestrach. To pozwala zaoszczędzić wiele ręcznych operacji bitowych, które byłyby niezbędne do odczytu/zapisu pól bez niego. Jedną z wad jest to, że nie można przyjąć adresu bitfields.

Powiązane problemy