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?
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?
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.
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
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
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
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
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.
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. –
Dzięki, doceniam te poprawki. Całkowicie usunąłem ten wiersz z mojego pytania, ponieważ nie było to istotne. – Tzafrir
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