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?
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?
Odpowiedzi:
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.
Jak wyjaśnia @ barrem23 , dane muszą być adresowalne , a najmniejszą granicą konwencjonalnych architektur jest bajt.
Ale ponieważ kwestia ta jest oznaczona jako C ++ , 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::search
może nie działać).