所以,实际上有几个问题:
int
(Int32
)被指定为(显然)32位。那么int?
(Nullable<int>
)怎么样?我的直觉告诉我,对于整数,它将是32位,加上布尔值的8位,但实现可能比实现更复杂。sizeof(int?)
回答我自己的问题;但由于int?
是托管类型,因此不允许这样做。我知道类型的大小可能与平台有关,而对于包含对其他对象的引用的对象,类似sizeof
的操作会产生误导。但是,在给定当前环境的情况下,是否有办法获得托管类型的“基线”大小(即,新实例化的实例的大小)?答案 0 :(得分:6)
您可以查看ildasm
或反射器。
如果有两个字段:bool
和T
,那么可能是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)
答案 3 :(得分:0)
考虑Marshal.SizeOf方法。它允许获取托管值类型的大小。这很奇怪,但看起来像nullable类型的大小等于它们的类型参数的大小(int的大小?等于int的大小等)