Odpowiedzi:
Ponieważ procesor nie może adresować niczego mniejszego niż bajt.
bt
, bts
, btr
i btc
może zająć pojedynczych bitów!
bt
adresuje przesunięcie bajtów, a następnie testuje bit przy danym przesunięciu, niezależnie od tego, kiedy określasz adres, który podajesz w bajtach ... literały bitowego przesunięcia byłyby nieco rozwlekłe (przepraszam za kalambur).
Z Wikipedii :
Historycznie bajt był liczbą bitów użytych do zakodowania pojedynczego znaku tekstu w komputerze iz tego powodu jest podstawowym elementem adresowalnym w wielu architekturach komputerów.
Tak bajt jest Podstawową jednostką adresowalnych , poniżej którego architektura komputer nie adres. A ponieważ nie ma (prawdopodobnie) komputerów obsługujących 4-bitowe bajty, nie masz 4-bitowych itd. bool
Jeśli jednak potrafisz zaprojektować taką architekturę, która może adresować 4-bitową jednostkę adresowalną jako podstawową adresowalną jednostkę, wówczas będziesz mieć bool
rozmiar 4-bitowy tylko na tym komputerze!
int
iz char
mojego postu.
bool
, ponieważ char
jest to najmniejsza adresowalna jednostka w C ++ , niezależnie od tego, co architektura może adresować za pomocą własnych kodów operacyjnych. sizeof(bool)
musi mieć wartość co najmniej 1, a sąsiednie bool
obiekty muszą mieć własne adresy w C ++ , więc implementacja musi tylko je powiększyć i marnować pamięć. Dlatego pola bitowe istnieją jako szczególny przypadek: elementy składowe bitfield struktury nie muszą być oddzielnie adresowalne, więc mogą być mniejsze niż a char
(chociaż cała struktura nadal nie może być).
char
jest to najmniejsza adresowalna jednostka w C ++?
sizeof(bool)
nie może to być 0.5 :-) Przypuszczam, że implementacja mogłaby legalnie dostarczać wskaźniki sub-bajtowe jako rozszerzenie, ale "zwykłe" obiekty, takie jak bool, przydzielone w zwykły sposób, muszą robić to, co mówi standard.
Najłatwiejsza odpowiedź brzmi; dzieje się tak dlatego, że procesor adresuje pamięć w bajtach, a nie w bitach, a operacje bitowe są bardzo wolne.
Jednak możliwe jest użycie alokacji rozmiaru bitowego w C ++. Istnieje specjalizacja std :: vector dla wektorów bitowych, a także struktury przyjmujące wpisy o rozmiarze bitowym.
W dawnych czasach, kiedy musiałem chodzić do szkoły w szalejącej zamieci, pod górę w obie strony, a obiad był jakimkolwiek zwierzęciem, które mogliśmy wytropić w lesie za szkołą i zabić gołymi rękami, komputery miały znacznie mniej dostępnej pamięci niż dzisiaj. Pierwszy komputer, z jakim korzystałem, miał 6 KB pamięci RAM. Nie 6 megabajtów, nie 6 gigabajtów, 6 kilobajtów. W tym środowisku bardzo sensowne było umieszczanie jak największej liczby wartości logicznych w int, więc regularnie korzystaliśmy z operacji, aby je usuwać i umieszczać.
Dzisiaj, gdy ludzie będą kpić z tego, że masz tylko 1 GB pamięci RAM, a jedynym miejscem, w którym można znaleźć dysk twardy o pojemności mniejszej niż 200 GB, jest antykwariat, po prostu nie warto pakować bitów.
Możesz użyć pól bitowych, aby uzyskać liczby całkowite o rozmiarze podrzędnym.
struct X
{
int val:4; // 4 bit int.
};
Chociaż jest zwykle używany do mapowania struktur do dokładnych oczekiwanych przez sprzęt wzorców bitów:
struct SomThing // 1 byte value (on a system where 8 bits is a byte
{
int p1:4; // 4 bit field
int p2:3; // 3 bit field
int p3:1; // 1 bit
};
Możesz mieć 1-bitowe boole oraz 4 i 2-bitowe liczby wewnętrzne. Ale to spowodowałoby dziwny zestaw instrukcji bez zwiększenia wydajności, ponieważ jest to nienaturalny sposób patrzenia na architekturę. W rzeczywistości sensowne jest „zmarnowanie” większej części bajtu, zamiast próbować odzyskać te nieużywane dane.
Z mojego doświadczenia wynika, że jedyną aplikacją, która przeszkadza spakować kilka wartości logicznych w jeden bajt, jest Sql Server.
bool
może być jednym bajtem - najmniejszy adresowalny rozmiar procesora lub może być większy. Nie jest niczym niezwykłym, aby mieć bool
rozmiar int
do celów wydajnościowych. Jeśli do określonych celów (np. Symulacja sprzętu) potrzebujesz typu z N bitami, możesz znaleźć bibliotekę do tego (np. Biblioteka GBL ma BitSet<N>
klasę). Jeśli martwisz się rozmiarem bool
(prawdopodobnie masz duży pojemnik,) możesz spakować bity samodzielnie lub użyć std::vector<bool>
tego, który zrobi to za Ciebie (uważaj na ten drugi, ponieważ nie spełnia on wymagań pojemnika).
Ponieważ ogólnie procesor przydziela pamięć z 1 bajtem jako jednostką podstawową, chociaż niektóre procesory, takie jak MIPS, używają 4-bajtowego słowa.
Jednak vector
zajmuje się bool
w specjalny sposób, z vector<bool>
jednym bitem na każdy bool.
lw
/ sw
są znacznie szerzej używane.
Bajt to mniejsza jednostka przechowywania danych cyfrowych w komputerze. W komputerze pamięć RAM ma miliony bajtów i każdy z nich ma adres. Gdyby miał adres dla każdego bitu, komputer mógłby zarządzać 8 razy mniej pamięci RAM niż może.
Więcej informacji: Wikipedia
Nawet jeśli minimalny możliwy rozmiar to 1 bajt, możesz mieć 8 bitów informacji logicznej w 1 bajcie:
http://en.wikipedia.org/wiki/Bit_array
Na przykład język Julia ma BitArray, a ja czytałem o implementacjach C ++.
struct Packed { unsigned int flag1 : 1; unsigned int flag2: 1; };
. Większość kompilatorów przydzieli pełneunsigned int
, jednak same radzą sobie z manipulowaniem bitami podczas odczytu / zapisu. Również samodzielnie radzą sobie z operacjami modulo. To znaczy, żeunsigned small : 4
atrybut ma wartość od 0 do 15, a kiedy powinien osiągnąć 16, nie nadpisze poprzedniego bitu :)