2010-07-06 17 views
36

Powiel możliwe:
What does ‘unsigned temp:3’ meansW języku C, co oznacza dwukropek w deklaracji?

uczę się trochę kodu jądra, a pojawił się następujący wiersz (w Linuksie 2.4 sched.h, struct mm_struct):

unsigned dumpable:1; 

Co to oznacza?

+0

trójdzielny jest podstawą trzy. Miałeś na myśli trójskładnik i choć jest to jedyny potrójny operator, jak John twierdzi, że to nie jest jego nazwa. –

+0

Dzięki, doceniam te poprawki. Całkowicie usunąłem ten wiersz z mojego pytania, ponieważ nie było to istotne. – Tzafrir

+4

Wierzę, że znacznik dwukropka powinien pozostać na tym pytaniu, ponieważ inni mogą, jak ja, użyć tego słowa, aby spróbować dowiedzieć się, co to oznacza, zanim zapyta. – Tzafrir

Odpowiedz

53

To członek bitfield. Twój kod oznacza dumpable zajmuje dokładnie 1 bit w strukturze.

Bitfieldy są używane, gdy chcesz spakować elementy na poziomie bitów. Może to znacznie zmniejszyć rozmiar pamięci używanej, gdy w strukturze znajduje się wiele flag. Na przykład, jeśli określenie struct zawierającym 4 członkom znanych ograniczeń numerycznej

0 < a < 20 
    b in [0, 1] 
0 < c < 8 
0 < d < 100 

to struktura może być zadeklarowane,

struct Foo { 
    unsigned a : 5; // 20 < 2^5 = 32 
    unsigned b : 1; // 
    unsigned c : 3; // 
    unsigned d : 7; // 100 < 2^7 = 128 
}; 

następnie bity Foo może powinny być rozmieszczone

     ddddddd c cc b aaaaa 
--------- --------- --------- ---------- 
         octet 1  octet 0 
=========================================== 
       uint32 

zamiast z

struct Foo { 
    unsigned a; 
    unsigned b; 
    unsigned c; 
    unsigned d; 
}; 

w którym wiele bitów marnowane są ze względu na zakres wartości

# wasted space which is not used by the program 
# v          v 
          ddddddd         ccc 
------------------------------------ ------------------------------------ 
      uint32         uint32 


            b        aaaaa 
------------------------------------ ------------------------------------ 
      uint32         uint32 

, dzięki czemu można zaoszczędzić miejsce przez pakowania wielu członków razem.

Należy zauważyć, że standard C nie określa sposobu rozmieszczenia bitów lub ich pakowania w "adresowalnej jednostce pamięci". Ponadto, bitfieldy są wolniejsze w porównaniu z bezpośrednim dostępem członków.

+5

Dzięki za wspaniałą odpowiedź! Warto zauważyć wyraźnie, dla dobra zwykłego czytelnika, że ​​implementacja tych pól bitowych jest nie tylko zależna od komputera, ale także zależna od kompilatora, a kod wykorzystujący założenia dotyczące lokalizacji tych bitów w pamięci jest wysoce nieopłacalny. – Tzafrir

+1

Standard C99 definiuje, że pola bitowe są umieszczone obok siebie, gdy dostępna jest wystarczająca ilość miejsca. "Implementacja może przydzielić dowolny adresowalny moduł pamięci na tyle duży, aby pomieścił bitfield." Jeśli pozostanie wystarczająca ilość miejsca, pole bitowe, które następuje bezpośrednio po innym polu bitowym w strukturze , zostanie spakowane w sąsiednie bity tego samego urządzenia. " – waynix

5

Oznacza to, że jest to pole bitowe - tzn. Rozmiar zrzutu jest jednobitowy i można do niego przypisać tylko 0 lub 1. Zwykle używany w starym kodzie w celu zaoszczędzenia miejsca lub w kodzie niskiego poziomu, który łączy się ze sprzętem (mimo że opakowanie jest nieprzenośne). Aby uzyskać więcej informacji, zobacz here

+0

Opakowanie niekoniecznie musi wyglądać prawidłowo. Często pola bitowe są wyrównane do granic 4 bajtów. Istnieją jednak opcje kompilacji, które mają na to wpływ. – GorillaPatch

3

Jeśli dobrze pamiętam, po użyciu wewnątrz struktury liczba po dwukropku oznacza liczbę bitów tworzących zmienną (lub bitfield).

Tak unsigned dumpable:1; jest jednobitowym bitfieldem.

Powiązane problemy