所以,实际上有几个问题:
- An
int
(Int32
) 被指定为(显然)32 位。怎么样int?
(Nullable<int>
)?我的直觉告诉我,整数将是 32 位,布尔值还要多 8 位,但实现可能比这更复杂。
- 我会用回答我自己的问题
sizeof(int?)
;但作为int?
是托管类型,这是不允许的。我知道类型的大小可能依赖于平台,并且在对象包含对其他对象的引用的情况下,sizeof
类似的操作会产生误导。但是,在给定当前环境的情况下,有没有办法获得托管类型的“基线”大小(即新实例化的实例的大小)?
永远不要问这样的问题非常重要,因为你不会得到直接的答案。
但既然你无论如何都这么做了:最小大小是 0 字节。当 JIT 优化器设法将值保留在 CPU 寄存器中时,您就会得到它。下一个大小是 2 个字节,对于 bool?和 byte?,1 个字节表示 HasValue,另一个字节表示值。你很少会得到这样的结果,因为局部变量必须与 4 的倍数的地址对齐。额外的 2 个字节的填充根本不会被使用。
下一个尺寸是短3吗?和 char?,您现在将获得 1 个字节的填充。
到下一个的大跃进,int?需要 5 个字节,但填充将其增加到 8 个。
等等。您可以通过编写如下代码来找到这一点:
int front = 42;
bool? center = null;
int back = 43;
Console.WriteLine("", front, center, back);
并使用调试器查看机器代码指令。注意 ebp 寄存器偏移量。并注意堆栈会向下增长。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)