为什么在C#中,bool数据类型的大小不只有1个比特?

28

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

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

似乎它只能容纳两个值(true或false),那么表示这个值只需要占用1位空间,对吗?

是因为在这篇帖子中所提到的,可寻址值的最小字节为1字节(8位)吗?

我的总体目标是逻辑地想象每种C#数据类型的不同大小,因此我试图创建一个所有数据类型及其分配位大小的列表,但这让我困扰了。


这个可能会对你有所帮助:https://dev59.com/ZHE95IYBdhLWcg3wb9hb#2308052 - Sayse
可能是为什么在.NET中System.Boolean占用4个字节?的重复问题。 - Ian Kemp
1
这个问题是4年前提出的,有一些有价值的答案,如果它被作为重复问题删除将会很遗憾。 - user1063287
3个回答

26

这是因为值的最小'可寻址'大小是一个字节吗?

是的,完全就是这个原因。为了让CLR更加高效,它以与C++编译器相似的方式将其数据类型映射到本地机器数据类型。


1
它从不进行任何打包操作 - 因此使用8个布尔值可能被表示为单个字节; 但实际上从未这样做。Pascal是一个处理此类问题的语言示例,但.NET肯定不会这样做。 - Luaan
1
具有讽刺意味的是,这个选择使得它非常低效,而不是高效:大多数计算现在都是受内存限制的:缓存未命中的时间长达数百个寄存器操作。为了每次索引操作节省一次移位和掩码操作,将内存使用乘以8倍甚至在20世纪80年代也不是一个好主意,更不用说现在了。 - James

4
如果你想要在占用空间最小的情况下存储大量标志,考虑使用Int32或Int64作为位掩码,这样你可以在32/64位数据类型中存储32或64个布尔标志。你需要进行位掩码测试来检查或设置值,因此访问或更新时会有一些额外的成本,相比于布尔变量。
布尔字段在内存中的大小为1字节,而布尔变量的大小为4字节。
BitArray也很方便处理大量位标志:http://msdn.microsoft.com/en-us/library/system.collections.bitarray.aspx

你在哪里发现布尔变量的大小为4个字节? - Tyler
1
@Tyler 在 .NET 中,为什么 System.Boolean 占用 4 字节空间? - Tim S.
你应该说最多4个字节,因为它实际上可能不会占用4个字节。 - Tyler

2
我也注意到了这个问题...我创建了两个数组:float[4000]和float?[4000]。第二个数组需要两倍的内存空间,因为float?被实现为一个float和一个bool,而这个bool最终会占用32位,就像float一样。
因此,如果内存使用是一个问题,那么在float[]中使用NaN浮点值来表示"null"比使用float?更好。
这让我感觉自己很傻,因为多年来我一直试图使用更小的数据类型,认为它实际上有所帮助! :-)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接