Dlaczego System.Boolean ma 4 bajty? Przechowuje tylko jeden stan, który może być przechowywany na mniejszej przestrzeni niż 4 bajty.Dlaczego wartość logiczna 4 bajty w .NET?
Odpowiedz
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.
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.
miły kontakt z adresem URL :) – Tom
Dzisiejsza pierwsza odpowiedź na to pytanie jest Google. Ponieważ pytania są archiwizowane, dodaj również konkretny link w przyszłości. – Blaisorblade
Jedynym powodem, dla którego nie wyszukiwałem google jest to, że sprawdzałem na tej samej stronie stackoverflow;) – Sun
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.
Myślę, że to tylko dla wydajności, wartości 32-bitowe są znacznie bardziej wydajne w obsłudze.
Skąd to masz? System.Boolean przyjmuje tylko bajt .
Spróbuj:
Console.WriteLine(sizeof(System.Boolean).ToString());
Sprawdź rozmiar po marszu typu: Console.Write (System.Runtime.InteropServices.Marshal.SizeOf (new System.Boolean())); – CMS
Czego nie powinieneś robić. Większość funkcji niezarządzanego API * int * dla wartości BOOL, Marhsal.SizeOf() informuje o rozmiarze * niezarządzanego * typu. – arul
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
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());
}
- 1. Dlaczego mój krótki zawierający 4 bajty w VB.NET
- 2. Checkbox wartość logiczna klasycznym ASP
- 3. Jak znaków 4 bajty reprezentowane w C#
- 4. Polymer 1,0 właściwość logiczna posiadające wartość domyślna wartość true
- 5. Jak przekonwertować 4 bajty na Swift float?
- 6. setItemChecked (pozycja int, wartość logiczna) nie działa?
- 7. Losowa wartość logiczna z wagą lub odchyleniem
- 8. x86 Czy push/pop może mieć mniej niż 4 bajty?
- 9. Czekaj, aż wartość logiczna zmienia jej stan
- 10. Zaneguj wartość logiczną opartą na innym logiczna
- 11. Lazy inicjalizacji w .NET 4
- 12. .NET Wyrażenia regularne na bajty zamiast znaków
- 13. W jaki sposób eax może zwracać wartość, której rozmiar jest większy niż 4 bajty?
- 14. Dlaczego zmienna referencyjna w klasie zawsze pobiera 4 bajty niezależnie od typu? (w systemie 32-bitowym)
- 15. Dlaczego zachowanie BeforeFieldInit zmieniło się w .NET 4?
- 16. jak wyodrębnić 4 bajty int 32bit w Lua
- 17. Jak przekonwertować z float na 4 bajty w Javie?
- 18. Wartość logiczna zwracana w wywołaniu funkcji do obiektu zerowego
- 19. Czy w Perlu istnieje wbudowana wartość logiczna true/false?
- 20. Dlaczego Guid.ToByteArray() porządkuje bajty tak, jak to robi?
- 21. Dlaczego tryb używa 4 bajtów?
- 22. .NET 4 ... Parallel.ForEach() pytanie
- 23. Zabicie zadania .NET 4?
- 24. gdy skompilowany pod .NET 4
- 25. TeamCity NUnitLauncher .net 4
- 26. Dlaczego pusty plik tekstowy zawiera 3 bajty?
- 27. xgboost binarna regresja logiczna
- 28. Konwertowanie .NET 4 Gwintowanie do .NET 2
- 29. kwadratowy logiczna roztwór
- 30. Dlaczego ktoś powinien używać profilu klienta .NET Framework 4?
Nawet Nullable zużyje tylko dwa bajty w niektórych przypadkach - na przykład, jeśli masz ich wiele. –
Tak, masz rację. Spodziewałbym się, że wyrówna indeksy tablicowe ze względu na wydajność, ale tak się nie wydaje. –
+1, odpowiedź jest tak dobra, że inni użytkownicy ją kradną. – Will