Nullable <int32>的大小是多少?</int32>

时间:2010-08-24 18:40:07

标签: .net int nullable sizeof boolean

所以,实际上有几个问题:

  1. intInt32)被指定为(显然)32位。那么int?Nullable<int>)怎么样?我的直觉告诉我,对于整数,它将是32位,加上布尔值的8位,但实现可能比实现更复杂。
  2. 我会用sizeof(int?)回答我自己的问题;但由于int?是托管类型,因此不允许这样做。我知道类型的大小可能与平台有关,而对于包含对其他对象的引用的对象,类似sizeof的操作会产生误导。但是,在给定当前环境的情况下,是否有办法获得托管类型的“基线”大小(即,新实例化的实例的大小)?

4 个答案:

答案 0 :(得分:6)

您可以查看ildasm或反射器。

如果有两个字段:boolT,那么可能是8个字节(假设4字节对齐)。

答案 1 :(得分:6)

永远不要问这样的问题是非常重要的,因为你不会得到一个直接的答案。

但是,无论如何你做了:最小大小为0字节。当JIT优化器设法将值保存在CPU寄存器中时,您将获得该值。 bool的下一个大小是2个字节?和字节?,HasValue为1个字节,值为另一个字节。你很少得到它,因为局部变量必须与一个4的倍数对齐。额外的2个字节的填充根本就不会被使用。

下一个尺码是3?和char ?,你现在得到1个字节的填充。

下一个大跃进,int?需要5个字节,但填充增加到8个。

等等。你可以通过写一些这样的代码来找到它:

        int front = 42;
        bool? center = null;
        int back = 43;
        Console.WriteLine("", front, center, back);

用调试器查看机器代码指令。注意ebp寄存器偏移量。请注意堆栈会逐渐减少。

答案 2 :(得分:2)

我找到了一个关于这个问题here的处理方法,其中包括一个用于测试内存使用情况的简单控制台应用程序的代码。

基本上,

  

...这表明可以为空的类型   包装器需要4个字节的存储空间......

答案 3 :(得分:0)

考虑Marshal.SizeOf方法。它允许获取托管值类型的大小。这很奇怪,但看起来像nullable类型的大小等于它们的类型参数的大小(int的大小?等于int的大小等)