2013-07-19 20 views
22

Właśnie uczę się C# i zagłębiam się w typy danych.Dlaczego rozmiar danych bool nie jest tylko 1-bitowy w C#?

Dlaczego 1-bitowy rozmiar danych nie jest bool?

Wygląda na to, że może zawierać tylko jedną z dwóch wartości (prawda lub fałsz), więc czy nie wystarczyłoby tylko 1 bit spacji do reprezentowania tej wartości?

Czy to dlatego, że najmniejszy "adresowalny" rozmiar wartości to bajt (8 bitów), o którym mowa w this post?

Moim ogólnym celem było logiczne wyobrażenie sobie różnych rozmiarów każdego typu danych w języku C#, więc próbowałem utworzyć listę wszystkich typów danych i ich przydzielonego rozmiaru bitowego, a to mnie rzuciło.

+0

[This] (http://stackoverflow.com/a/2308052/1324033) może ci pomóc – Sayse

+0

Możliwy duplikat [Dlaczego w .NET System.Boolean ma 4 bajty?] (Https: // stackoverflow .com/questions/294905/why-in-net-system-boolean-takes-4-byte) –

+0

To pytanie zostało zadane 4 lata temu i ma kilka cennych odpowiedzi, byłoby szkoda, gdyby zostało usunięte jako duplikat. – user1063287

Odpowiedz

23

Czy dlatego, że najmniejszy „adresowalny” wielkość wartości jest bajt

Tak, dokładnie to samo . Aby CLR był efektywny, mapuje swoje typy danych na rodzime typy danych maszynowych w bardzo podobny sposób, jak robi to kompilator w C++ (w zasadzie).

+0

I nie robi żadnego pakowania, nigdy - więc używanie 8 bitów * mogło * być przedstawiane jako pojedynczy bajt; ale nigdy nie jest. Pascal jest przykładem języka, który sobie z tym poradzi, ale .NET z pewnością tego nie robi. – Luaan

3

Jeśli chcesz przechowywać wiele flag w sposób efektywny pod względem przestrzeni, rozważ użycie Int32 lub Int64 jako maski bitowej, w ten sposób możesz przechowywać 32 lub 64 flagi boolowskie w 32/64-bitowym typie danych. Musisz wykonać testy bitmaskowe, aby sprawdzić lub ustawić wartości, więc istnieje niewielki dodatkowy koszt dostępu lub aktualizacji za pomocą zmiennej Boole'a.

Wielkość pola logicznego w pamięci to 1 bajt, a zmienna boolowska 4 bajty.

BitArray jest również przydatny do czynienia z dużą ilością flag bitowych: http://msdn.microsoft.com/en-us/library/system.collections.bitarray.aspx

+0

Gdzie znajdujesz rozmiar zmiennej Boolean na 4 bajty? – Tyler

+1

@Tyler http://stackoverflow.com/questions/294905/why-in-net-system-boolean-takes-4-byte –

+0

Powinieneś powiedzieć maks. 4 bajty, ponieważ może to w rzeczywistości nie zaowocować 4 bajty. – Tyler

1

Zauważyłem to również ... Stworzyłem dwie tablice: float [4000] i float? [4000]. Druga tablica zajmuje dwa razy więcej miejsca w pamięci, ponieważ pływa? jest implementowany jako float i bool, a bool kończy się przyjmowaniem 32 bitów tak samo jak float.

Ostatecznie, jeśli użycie pamięci jest problemem, użycie wartości pływającej NaN do reprezentowania wartości "null" w float [] jest lepsze niż użycie float? [].

Sprawia, że ​​czuję się jak idiota przez te wszystkie lata, w których próbowałem użyć mniejszych typów danych, wierząc, że to naprawdę coś dobrego! :-)