我只是在学习 C# 并深入研究数据类型。
为什么bool
数据类型的大小不是 1 位?
似乎它只能保存两个值(真或假)之一,那么这不会只占用 1 位空间来表示该值吗?
是因为值的最小“可寻址”大小是本文中提到的一个字节(8 位)吗?
我的总体目标是在逻辑上设想 C# 中每种数据类型的不同大小,所以我试图创建所有数据类型及其分配的位大小的列表,这让我很震惊。
是不是因为一个值的最小“可寻址”大小是一个字节
是的,完全一样的东西。为了使 CLR 高效,它将其数据类型映射到本机机器数据类型,其方式与编译器在 C++ 中所做的方式非常相似(几乎)。
如果您想以节省空间的方式存储大量标志,请考虑使用 Int32 或 Int64 作为位掩码,这样您可以在 32 / 64 位数据类型中存储 32 或 64 个布尔标志。您必须进行位掩码测试来检查或设置值,因此通过布尔变量访问或更新会产生少量额外成本。
内存中布尔字段的大小为 1 个字节,布尔变量的大小为 4 个字节。
BitArray 也可以方便地处理大量位标志:http: //msdn.microsoft.com/en-us/library/system.collections.bitarray.aspx
我也注意到了这一点……我创建了两个数组:float[4000] 和 float?[4000]。第二个数组占用两倍的内存空间,因为 float? 实现为浮点数和布尔值,并且布尔值最终占用 32 位,与浮点数相同。
所以最后,如果内存使用是一个问题,在 float[] 中使用 NaN 浮点值表示“null”比使用 float?[] 更好。
让我感觉自己像个白痴,多年来我一直在尝试使用较小的数据类型,并认为它实际上做了一些好事!:-)