可能重复:
在C#中布尔值的二进制表示是什么
根据MSDN文档,sizeof
关键字用于“获取非托管类型的字节大小”,原始类型被认为是非托管类型。如果我检查sizeof(bool)
,结果为1。
在我看来,使用布尔值只需要一点内存。我错了吗?使用Boolean
值实际上需要一个完整的字节吗?为什么?
可能重复:
在C#中布尔值的二进制表示是什么
根据MSDN文档,sizeof
关键字用于“获取非托管类型的字节大小”,原始类型被认为是非托管类型。如果我检查sizeof(bool)
,结果为1。
在我看来,使用布尔值只需要一点内存。我错了吗?使用Boolean
值实际上需要一个完整的字节吗?为什么?
出于性能方面的原因,它使用了一个完整的字节存储。
如果只使用一个比特,那么你要用其他7个比特做什么?很少有变量是布尔型,而其他变量可能不需要一个比特。因此,它只对其他布尔值有用。
例如,4字节整数。此外,许多较大的类型需要从适当的字节边界开始,以提高性能。例如,CPU 可能不允许您轻松地引用从任何地址开始的 4 字节地址(即地址可能需要被 4 整除)。
如果它使用一个比特的内存,这意味着其他7个比特可以用于其他布尔值,那么尝试使用这个布尔值将更加复杂。因为它不能直接寻址,所以在测试它是1还是0之前,需要先获取字节并提取比特。这意味着需要更多的指令-因此性能更慢。
如果您有许多布尔值,并且希望它们每个仅使用一个比特的内存,请使用 BitArray
。这些是单比特的容器。它们的作用类似于布尔数组。
字节是可寻址内存中最小的单位。.NET团队选择使用一个字节来存储bool
类型数据,以简化实现过程。
如果您想更紧凑地存储大量位信息,可以查看BitArray
。
bool
之间,没有性能上的优势,我的结论正确吗? - smartcaveman是的,它需要一个完整的字节内存,因为这是最小可寻址的内存。
当然,可以想出一种方案,在同一个字节中放置多个布尔值,从而节省空间。对于更多的情况,这种解决方案的开销将比节省的空间更多。
如果您有大量位要存储,专用的位向量(例如Mark Byers提到的BitArray)可以节省宝贵的空间。
如果你认为1字节的数字值是1,那是因为sizeof。那么它怎么能说是1位呢?不可能,要么它向下取整并返回0,这是不可能的,要么它返回1,因为它占用了一个字节来保存,因为你不能以位为单位保存。
但是无论它是作为位还是字节进行管理,我不知道。
在C++中,你可以在变量名后面添加:1来表示它应该只有1位宽度。