Dlaczego wartość logiczna jest przechowywana w komputerze jako bajt, gdy wymaga tylko jednego bitu

32

Niedawno zacząłem uczyć się pisać kod i w swojej książce natknąłem się na to pytanie. „Dlaczego wartość logiczna jest przechowywana w komputerze jako bajt, gdy wymaga tylko jednego bitu?” czy ktoś może rzucić więcej światła na to pytanie?

Mr. 1.0
źródło
10
To nie jest ściśle prawdą. Niektóre języki (jak C / C ++) zapewniają sposoby przechowywania wartości boolowskich jako pojedynczych bitów, jeśli te bity są spakowane w jeden bajt. Innymi słowy, w C można zapisać osiem bajtów w bajcie. Ale niewielu z nich korzysta, ponieważ pamięć jest tania, a procesory manipulują danymi w porcjach 8/16/32/64 bitowych.
Gort the Robot
Oto odpowiedź na podobne pytanie ! Dostaniesz tam ogromne referencje ... Pozdrawiam!
Sam
Ściśle powiązane: stackoverflow.com/questions/8014161/…
Ben Lee

Odpowiedzi:

49

Ma to związek z tym, co procesor może łatwo rozwiązać. Na przykład procesor x86 ma eax(32 bity), ax(16 bitów) i ah(8 bitów), ale nie ma rejestru jednobitowego. Aby więc użyć jednego bitu, CPU będzie musiał wykonać odczyt / modyfikację / zapis w celu zmiany wartości. Jeśli jest przechowywany jako bajt, do sprawdzenia / zmiany wartości można użyć pojedynczego odczytu lub zapisu.

Dodatkowo można się zastanawiać, czy lepiej byłoby użyć jednego bitu zamiast pełnego bajtu, w końcu bajt marnuje 7 bitów. O ile przestrzeń nie jest ograniczeniem, należy wybrać bajt, ponieważ przynajmniej x86 i myślę, że inni, zwykle są instrukcje, aby szybko ustawić / wyczyścić bool, który jest znacznie szybszy niż odczyt / modyfikacja / zapis jednego bitu . Z osobistych pomiarów widziałem, że metoda odczytu / modu / zapisu jest 5 razy wolniejsza niż metoda pojedynczej instrukcji.

barrem23
źródło
6
Jedynym brakującym słowem jest „Wyrównanie granic”.
Manoj R
3
Z drugiej strony widziałem przyspieszenie 2x przy użyciu pojedynczych bitów, prawdopodobnie ze względu na lepsze użycie pamięci podręcznej przy mniejszym zestawie danych.
Michael Borgwardt
5

Jak wyjaśnia @ barrem23 , dane muszą być adresowalne , a najmniejszą granicą konwencjonalnych architektur jest bajt.

Ale ponieważ kwestia ta jest oznaczona jako , może warto zwrócić uwagę, że std::vector<bool>jest specjalizuje się w celu umożliwienia poszczególne elementy mają być przechowywane jako bity . Pozwoli to zaoszczędzić miejsce, poświęcając część funkcjonalności (na przykład std::searchmoże nie działać).

chrisaycock
źródło