Почему логические 4 байта в .NET? - программирование
Подтвердить что ты не робот

Почему логические 4 байта в .NET?

Почему System.Boolean принимает 4 байта? Он просто сохраняет одно состояние, истинное или ложное, которое может храниться в меньшем пространстве, чем 4 байта.

4b9b3361

Ответ 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());
}