为啥 C# 中 bool 数据类型的大小不是只有 1 位?

Posted

技术标签:

【中文标题】为啥 C# 中 bool 数据类型的大小不是只有 1 位?【英文标题】:Why isn't the size of a bool data type only 1 bit in C#?为什么 C# 中 bool 数据类型的大小不是只有 1 位? 【发布时间】:2013-07-18 16:31:41 【问题描述】:

我只是在学习 C# 并深入研究数据类型。

为什么bool 数据类型的大小不是 1 位?

它似乎只能保存两个值之一(真或假),那岂不是只占用 1 位空间来表示该值吗?

是否因为值的最小“可寻址”大小是 this post 中提到的一个字节(8 位)?

我的总体目标是从逻辑上设想 C# 中每种数据类型的不同大小,因此我试图创建所有数据类型及其分配的位大小的列表,这让我很震惊。

【问题讨论】:

This 可以帮到你 Why in .NET System.Boolean takes 4 byte?的可能重复 这个问题是 4 年前提出的,有一些有价值的答案,如果它作为重复删除将很遗憾。 【参考方案1】:

是不是因为一个值的最小“可寻址”大小是一个字节

是的,完全一样。为了让 CLR 更高效,它会将其数据类型映射到本机机器数据类型,其方式与编译器在 C++ 中所做的方式非常相似(几乎)。

【讨论】:

而且它从来没有做任何打包 - 所以使用 8 个布尔值 可以 表示为一个字节;但它从来都不是。 Pascal 是一个可以为您处理的语言示例,但 .NET 肯定不会这样做。 具有讽刺意味的是,这种选择使其效率极低,效率不高:如今大多数计算都受内存限制:缓存未命中需要多达数百个寄存器操作。将内存使用量乘以 8 以节省每个索引操作的移位和掩码在 1980 年代甚至不是一个好主意,现在更不用说了。【参考方案2】:

如果您想以节省空间的方式存储大量标志,请考虑使用 Int32 或 Int64 作为位掩码,这样您可以在 32 / 64 位数据类型中存储 32 或 64 个布尔标志。您必须进行位掩码测试来检查或设置值,因此通过布尔变量访问或更新会产生少量额外成本。

内存中布尔字段的大小为1字节,布尔变量的大小为4字节。

BitArray 也可以方便地处理大量位标志:http://msdn.microsoft.com/en-us/library/system.collections.bitarray.aspx

【讨论】:

你在哪里找到一个布尔变量的大小是 4 个字节? @Tyler ***.com/questions/294905/… 你应该说最多 4 个字节,因为它实际上可能不会占用 4 个字节。【参考方案3】:

我也注意到了这一点...我创建了两个数组:float[4000] 和 float?[4000]。第二个数组占用两倍的内存空间,因为 float?实现为 float 和 bool,bool 最终占用 32 位,与 float 相同。

所以最后,如果内存使用是一个问题,在 float[] 中使用 NaN 浮点值表示“null”比使用 float?[] 更好。

让我感觉自己像个白痴,多年来我一直在尝试使用较小的数据类型,并认为它实际上在做一些好事! :-)

【讨论】:

以上是关于为啥 C# 中 bool 数据类型的大小不是只有 1 位?的主要内容,如果未能解决你的问题,请参考以下文章

c#中读取数据库bit布尔字段数据转换Int和bool时的错误

C# bool 是原子的,为啥 volatile 有效

为啥我的 Haskell 函数参数必须是 Bool 类型?

错题总结Java

Python数据结构之布尔类型(bool)

为啥从数据库取出来的值为1,0,用java取出来变成true,false