为什么C#中的sizeof(bool)== sizeof(byte)?

时间:2012-09-02 09:20:45

标签: c# memory-management boolean byte sizeof

  

可能重复:
  What is the binary representation of a boolean value in c#

根据MSDN documentationsizeof关键字“用于获取非托管类型的字节大小”,基元被视为非托管类型。如果我检查sizeof(bool),则结果为1.

在我看来,使用布尔值应该只需要一点内存。我错了吗?使用Boolean值实际上需要一个完整的内存字节吗?为什么呢?

4 个答案:

答案 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位宽。

相关问题