2008-11-17 16 views

Odpowiedz

50

bool jest faktycznie tylko 1 bajt, ale ustawienie może powodować 4 bajty do wykorzystania na platformie 32-bitowej, a nawet 8 bajtów na platformie 64-bitowej. Na przykład typ Nullable<bool> (znany również jako bool?) wykorzystuje pełne 32 lub 64 bity - w zależności od platformy - nawet jeśli składa się z zaledwie dwóch bool s. EDYCJA: Jak zauważył Jon Skeet, wyściółka do wyrównania nie jest zawsze obecna w postaci . Na przykład tablica o rozmiarze Nullable<bool> s zajmuje tylko 2 bajty na obiekt, zamiast 4 lub 8.

Ale nawet 8 bitów na reprezentację bool może być uważane za nieekonomiczne, jeśli wiele z nich jest przechowywanych. Z tego powodu, jeśli utworzysz typ, który ma wiele elementów o nazwach bool (lub korzysta z wielu typów Nullable<>), użytkownicy klas mogą tworzyć wiele jego instancji, możesz zamiast tego użyć opcji . Środowisko samo w sobie wykorzystuje tę technikę, aby zmniejszyć na przykład ślad pamięci wielu formantów Windows Forms.

+3

Nawet Nullable zużyje tylko dwa bajty w niektórych przypadkach - na przykład, jeśli masz ich wiele. –

+0

Tak, masz rację. Spodziewałbym się, że wyrówna indeksy tablicowe ze względu na wydajność, ale tak się nie wydaje. –

+2

+1, odpowiedź jest tak dobra, że ​​inni użytkownicy ją kradną. – Will

6

Pierwszy wynik wyszukiwania Google dla System.Boolean size powiedział mi, że ma to związek z wyrównaniem pamięci. Szybciej przesuwać czterobajtowe Int32 niż pracować z pojedynczymi bajtami/bitami.

+0

miły kontakt z adresem URL :) – Tom

+4

Dzisiejsza pierwsza odpowiedź na to pytanie jest Google. Ponieważ pytania są archiwizowane, dodaj również konkretny link w przyszłości. – Blaisorblade

+0

Jedynym powodem, dla którego nie wyszukiwałem google jest to, że sprawdzałem na tej samej stronie stackoverflow;) – Sun

13

Ponieważ jest szybki.

32-bitowy procesor zazwyczaj działa z wartościami 32-bitowymi. Praca z mniejszymi wartościami wymaga dłuższych instrukcji lub dodatkowej logiki.

1

Myślę, że to tylko dla wydajności, wartości 32-bitowe są znacznie bardziej wydajne w obsłudze.

1

Skąd to masz? System.Boolean przyjmuje tylko bajt .

Spróbuj:

Console.WriteLine(sizeof(System.Boolean).ToString()); 
+0

Sprawdź rozmiar po marszu typu: Console.Write (System.Runtime.InteropServices.Marshal.SizeOf (new System.Boolean())); – CMS

+0

Czego nie powinieneś robić. Większość funkcji niezarządzanego API * int * dla wartości BOOL, Marhsal.SizeOf() informuje o rozmiarze * niezarządzanego * typu. – arul

+0

Załatwienie bool jest nieco bardziej skomplikowane. Zrobiłem wpis na blogu na ten temat, który obejmuje różne rozmiary: http://blogs.msdn.com/jaredpar/archive/2008/10/14/pinvoke-and-bool-or-should-i-say-bool. aspx – JaredPar

0

Użyłem następującego kodu, aby utworzyć kilka tablic i przetestować je. float? [100000] zużywa dwa razy więcej pamięci niż float [100000]. To dlatego, że bool towarzyszy floatowi w float? Sprawa zostaje wyrównany do 32 bitów (przynajmniej na moim komputerze ;-))

long startMem = 0, stopMem = 0; 
DateTime startTime = DateTime.Now; 
private void StartMemoryUsage() 
{ 
    GC.Collect(); 
    GC.Collect(); 
    startMem = GC.GetTotalMemory(true); 
    startTime = DateTime.Now; 
} 
private void StopMemoryUsage() 
{ 
    GC.Collect(); 
    GC.Collect(); 
    stopMem = GC.GetTotalMemory(true); 

    Console.WriteLine("---> {0} sec. Using {1} KB.", (DateTime.Now - startTime).TotalSeconds, ((stopMem - startMem)/1000).ToString()); 
} 
Powiązane problemy