为什么.NET中的布尔值是4个字节?

时间:2008-11-17 04:51:57

标签: .net

为什么System.Boolean需要4个字节?它只存储一个状态, true false ,它们可以存储在比4个字节更少的空间中。

6 个答案:

答案 0 :(得分:56)

bool实际上只有1个字节,但对齐可能会导致在32位平台上使用4个字节,甚至在64位平台上使用8个字节。例如,Nullable<bool>(aka bool?)类型使用完整的32位或64位 - 具体取决于平台 - 即使它只包含两个bool s。 编辑:正如Jon Skeet所指出的,对齐的填充不是总是存在。例如,Nullable<bool>的数组每个对象只需要2个字节而不是4个或8个。

但如果要存储其中许多内容,即使代表bool的8位也可能被视为浪费。因此,如果您创建的类型有bool个成员,(或使用多个Nullable<>类型),您的类的用户可能会创建许多实例它,您可以考虑使用BitVector32代替。例如,框架本身使用这种技术来减少许多Windows窗体控件的内存占用。

答案 1 :(得分:13)

因为它很快。

32位处理器通常使用32位值。使用较小的值涉及较长的指令或额外的逻辑。

答案 2 :(得分:6)

Google搜索System.Boolean size的第一个结果告诉我,这与内存对齐有关。推动四字节Int32比使用单个字节/位更快。

答案 3 :(得分:2)

我认为这只是为了提高性能,32位值的操作效率要高得多。

答案 4 :(得分:2)

你从哪里得到的? System.Boolean只接受 1 字节。

试试吧:

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

答案 5 :(得分:0)

我使用以下代码创建了几个数组并测试它们。 float?[100000]使用的内存是float [100000]的两倍。这是因为漂浮在漂浮物中的bool? case被对齐到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());
}