26

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

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

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

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

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

4

3 回答 3

25

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

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

于 2013-07-19T11:50:53.480 回答
4

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

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

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

于 2013-07-19T11:42:37.783 回答
2

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

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

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

于 2014-02-14T15:46:45.190 回答