Почему System.Boolean принимает 4 байта? Он просто сохраняет одно состояние, истинное или ложное, которое может храниться в меньшем пространстве, чем 4 байта.
Почему логические 4 байта в .NET?
Ответ 1
A bool
на самом деле всего 1 байт, но выравнивание может привести к использованию 4 байта на 32-битной платформе или даже 8 байтах на 64-битной платформе. Например, тип Nullable<bool>
(aka bool?
) использует полные 32 или 64 бита - в зависимости от платформы - хотя он состоит всего из двух bool
s. РЕДАКТИРОВАТЬ. Как отметил Джон Скит, дополнение для выравнивания не всегда присутствует. В качестве примера массив из Nullable<bool>
занимает всего 2 байта на объект вместо 4 или 8.
Но даже 8 бит для представления bool
можно считать расточительным, если у вас их много для хранения. По этой причине, если вы создаете тип, в котором есть много bool
как членов, (или использует много типов Nullable<>
), пользователи и вашего класса могут создавать множество его экземпляров, вы можете подумать используя вместо этого BitVector32
. Сама инфраструктура использует этот метод, например, для уменьшения объема памяти многих элементов управления Windows Forms.
Ответ 2
Потому что это быстро.
32-разрядный процессор обычно работает с 32-битными значениями. Работа с меньшими значениями включает в себя более длинные инструкции или дополнительную логику.
Ответ 3
Первый результат поиска в Google System.Boolean size сказал мне, что это касается выравнивания памяти. Это быстрее, чтобы обойти четырехбайтовый Int32, чем работать с отдельными байтами/битами.
Ответ 4
Я думаю, что это только для производительности, 32-битные значения намного эффективнее манипулировать.
Ответ 5
Где ты это понял? System.Boolean принимает только 1 байт.
Просто попробуйте:
Console.WriteLine( sizeof( System.Boolean ).ToString() );
Ответ 6
Я использовал следующий код, чтобы создать пару массивов и протестировать их. float? [100000] использует вдвое больше памяти, чем float [100000]. Это потому, что bool, который сопровождает float в поплавке? случай выравнивается до 32 бит (по крайней мере, на моей машине;-))
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());
}