5

可能重复:
c# 中布尔值的二进制表示形式是什么

根据MSDN 文档,该sizeof关键字“用于获取非托管类型的字节大小”,并且原语被视为非托管类型。如果我检查sizeof(bool),结果是 1。

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

4

4 回答 4

14

出于性能原因,它使用整个字节的内存。

如果它只使用一个位,那么你如何处理其他 7 个位?很少有变量是布尔值,其他变量可能不需要一个位。所以它只对其他布尔值有用。

例如,4 字节整数。此外,出于性能原因,许多较大的类型需要从适当的字节边界开始。例如,CPU 可能不允许您轻松引用从任何地址开始的 4 字节地址(即,该地址可能需要被 4 整除)。

如果它使用一位内存,这意味着其他 7 位可以用于其他布尔值,尝试使用这个布尔值会更复杂。因为它不是直接可寻址的,所以在测试它是 1 还是 0 之前,您需要获取字节,然后提取该位。这意味着更多的指令 - 因此性能更慢。

如果你有很多布尔值,并且你希望它们每个只使用一个内存位,你应该使用BitArray. 这些是单个位的容​​器。它们的行为类似于布尔数组。

于 2012-09-02T09:23:06.963 回答
7

一个字节是最小的可寻址内存量。.NET 团队选择使用一个字节来存储 abool以简化实现。

如果您想更紧凑地存储大量位,可以查看BitArray.

于 2012-09-02T09:22:26.007 回答
4

是的,它需要一个完整字节的内存,因为那是最小的可寻址内存。

当然可以提出一种方案,其中可以将多个布尔值放在同一个字节中,从而节省空间。在更多情况下,这种解决方案的开销将远远超过获得的成本。

如果你有很多位要存储,一个专门的位向量(比如 Mark Byers 提到的 BitArray)可以节省宝贵的空间。

于 2012-09-02T09:22:58.273 回答
1

如果您将 1 Byte 视为由于 sizeof 而导致的数值为 1。那么它怎么能说1位呢?不可能,要么它落地并返回 0,那是不可能的,要么它返回 1,因为它占用了保存一个字节,因为你不保存位。

但我不知道它是按位还是字节来管理的。

在 c++ 中,您在变量名中添加 a :1 表示它应该只有 1 位宽。

于 2012-09-02T09:24:28.997 回答