可能重复:
What is the binary representation of a boolean value in c#
根据MSDN documentation,sizeof
关键字“用于获取非托管类型的字节大小”,基元被视为非托管类型。如果我检查sizeof(bool)
,则结果为1.
在我看来,使用布尔值应该只需要一点内存。我错了吗?使用Boolean
值实际上需要一个完整的内存字节吗?为什么呢?
答案 0 :(得分:12)
出于性能原因,它使用整个字节的内存。
如果它只使用一个位,你用其他7位做什么?很少有变量是布尔值,其他变量可能不需要一个位。所以它只对其他布尔人有用。
例如,4字节整数。此外,出于性能原因,许多较大类型需要从适当的字节边界开始。例如,CPU可能不允许您从任何地址开始轻松引用4字节地址(即地址可能需要被4整除)。
如果它使用一位内存,意味着其他7位可用于其他布尔值,尝试使用此布尔值会更复杂。因为它不是可直接寻址的,所以你需要获取字节,然后在测试之前提取该位,如果它是1或0.这意味着更多的指令 - 因此性能更慢。
如果您有许多布尔值,并且您希望它们仅使用一位内存EACH,则应使用BitArray
。这些是单比特的容器。它们就像布尔阵列一样。
答案 1 :(得分:7)
字节是可寻址内存的最小量。 .NET团队选择使用一个字节来存储bool
以简化实现。
如果您想更紧凑地存储大量位,可以查看BitArray
。
答案 2 :(得分:4)
是的,它需要一个完整的内存字节,因为那是最小的可寻址内存。
当然可以提出一种方案,其中几个bool可以放在同一个字节中,从而节省空间。对于更多情况,这种解决方案的开销将比获得的成本高得多。
如果你有很多要存储的位,一个专门的位向量(比如Mark Byers metnions的BitArray)可以节省宝贵的空间。
答案 3 :(得分:1)
如果您考虑1个字节,因为sizeof数值为1。那怎么说1位呢?不可能,无论是地板还是返回0都是不可能的,或者它返回1,因为它占用了一个字节,因为你没有保存位。
但是,它不管是一点点还是一个字节,我都不知道。
在c ++中,你添加到变量名a:1,说它应该只有1位宽。