为啥 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 位?的主要内容,如果未能解决你的问题,请参考以下文章