W C ++ zastanawiam się, dlaczego typ bool ma długość 8 bitów (w moim systemie), gdzie tylko jeden bit wystarczy do przechowywania wartości boolowskiej?
Kiedyś sądziłem, że dzieje się tak ze względu na wydajność, ale na komputerze 32- lub 64-bitowym, gdzie rejestry mają szerokość 32 lub 64 bitów, jaka jest przewaga wydajności?
A może to tylko jeden z tych „historycznych” powodów?
sizeof(bool)
Prosiłem o system, w którym byłby 4. Mógłbym przysiąc, że msvc ma 32-bitowe boole, ale po prostu próbowałem i tak nie jest.vector<bool>
nie polega na tym, że stara się być sprytny i pakować wartości logiczne w bity, ale próbuje to zrobić i ukryć się jako kontener STL . Zwykły zestaw bitów byłby dobry, o ile nie udaje kontenera STL.bool
typ danych C ++ zBOOL
typem systemu Windows, który jest zdefiniowany jakolong
. Tak więcsizeof(bool) != sizeof(BOOL)
, co na pewno powoduje wiele zamieszania (i prawdopodobnie sporo błędów). Zwłaszcza, że w systemie Windows są równieżboolean
iBOOLEAN
typedefs, które są aliasami dlaunsigned char
. Zwróć również uwagę, że chociaż częstobool
jest to 1 bajt, standard C ++ ma notatkę, która wyraźnie wskazuje, żesizeof(bool)
może być większy.Odpowiedzi:
Ponieważ każdy typ danych C ++ musi być adresowalny.
Jak utworzyłbyś wskaźnik do pojedynczego bitu? Nie możesz. Ale można utworzyć wskaźnik do bajta. Tak więc wartość logiczna w C ++ ma zazwyczaj rozmiar bajtowy. (Może być również większy. To zależy od implementacji. Najważniejsze jest to, że musi być adresowalny, więc żaden typ danych w C ++ nie może być mniejszy niż bajt)
źródło
Pamięć jest adresowalna bajtowo. Nie można zaadresować pojedynczego bitu bez przesuwania lub maskowania bajtu odczytanego z pamięci. Myślę, że to bardzo duży powód.
źródło
boolean
Typu normalnie następuje najmniejszą jednostkę adresowalnych pamięci urządzenia docelowego (to znaczy zwykle bajtów 8 bitów).Dostęp do pamięci jest zawsze w „porcjach” (wiele słów, dotyczy to wydajności na poziomie sprzętowym , transakcji magistrali): bit boolowski nie może być adresowany „samodzielnie” w większości systemów CPU. Oczywiście, gdy dane są zawarte w rejestrze , często pojawiają się wyspecjalizowane instrukcje dotyczące niezależnego manipulowania bitami.
Z tego powodu dość powszechne jest stosowanie technik „pakowania bitów” w celu zwiększenia wydajności używania „logicznych” podstawowych typów danych. Technika taka jak
enum
(w C) z potęgą kodowania 2 jest dobrym przykładem. Ten sam rodzaj sztuczki można znaleźć w większości języków.Zaktualizowano : Dzięki doskonałej dyskusji zwróciłem uwagę, że
sizeof(char)==1
z definicji w C ++. W związku z tym adresowanie „logicznego” typu danych jest dość powiązane z najmniejszą jednostką adresowalnej pamięci (wzmacnia mój punkt widzenia).źródło
bool
typ następuje po najmniejszej jednostce przydzielanej pamięci, ponieważ C ++ wymaga, aby było możliwe utworzenie do niego wskaźników . Bez tego wymogu,bool
można by sobie wyobrazić, że byłby reprezentowany jako pojedynczy bit nawet na obecnych maszynach adresowanych bajtami.sizeof(char)==1 definition
to najlepszy kontrargument do mojej argumentacji. Dzięki!Odpowiedzi, że 8-bitów to najmniejsza ilość pamięci, która jest adresowalna, są poprawne. Jednak niektóre języki mogą w pewnym sensie używać 1-bitowych wartości logicznych. Wydaje mi się, że Pascal implementował zestawy jako ciągi bitów. To znaczy dla następującego zestawu:
{1, 2, 5, 7}
Możesz mieć to w pamięci:
01100101
Jeśli chcesz, możesz oczywiście zrobić coś podobnego w C / C ++. (Jeśli śledzisz kilka wartości logicznych, może to mieć sens, ale tak naprawdę zależy od sytuacji).
źródło
vector
. W rzeczywistości nie jest to kontener typu STL, ponieważ istnieją ograniczenia dotyczące zachowania. Co gorsza, powoduje to problemy, gdy ktoś mabool
si i chce je zrobićvector
. To zaskakujące zachowanie, a nie tego chcesz w języku.Wiem, że to jest stare, ale pomyślałem, że dorzucę moje 2 centy.
Jeśli ograniczysz wartość logiczną lub typ danych do jednego bitu, Twoja aplikacja będzie narażona na uszkodzenie pamięci. Jak radzisz sobie ze statystykami błędów w pamięci, która ma tylko jeden bit?
Poszedłem na rozmowę kwalifikacyjną i jedno ze stwierdzeń, które kierownik programu powiedział mi, brzmiało: „Kiedy wysyłamy sygnał do wystrzelenia pocisku, po prostu wysyłamy prosty, jeden bit przez sieć bezprzewodową. potrzebuję tego sygnału, aby był jak najszybszy ”.
Cóż, był to test, aby sprawdzić, czy rozumiem pojęcia i bity, bajty i obsługa błędów. Jak łatwo byłoby złemu facetowi wysłać krótką wiadomość. Albo co się stanie, jeśli podczas transmisji bit zostanie odwrócony w drugą stronę.
źródło
bool
używa 8 bitów na maszynie OP i 32 na mojej, ponieważ te pozostałe 7 lub 31 bitów z pewnością nie są używane do żadnych „statystyk błędów”. To nie ma sensuNiektóre wbudowane kompilatory mają typ int1, który jest używany do pakowania bitowych flag logicznych (np. Kompilatory C serii CCS dla mikrochipów MPU). Ustawianie, czyszczenie i testowanie tych zmiennych wykorzystuje instrukcje na poziomie bitów składające się z jednej instrukcji, ale kompilator nie zezwoli na żadne inne operacje (np. Pobranie adresu zmiennej) z powodów wymienionych w innych odpowiedziach.
źródło