为什么System.Boolean需要4个字节?它只存储一个状态, true 或 false ,它们可以存储在比4个字节更少的空间中。
答案 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());
}