为什么在32位.NET进程中,引用类型的最小大小为12字节?

4
我正在阅读Pro .Net Performance书籍中关于引用类型内部的章节。它提到对于一个32位的.net进程,引用类型有4个字节的对象头和4个字节的方法表指针。此外,它还说在32位系统上,对象被对齐到最近的4字节倍数,这使得引用类型的最小大小为12个字节。
我的问题是,为什么最小大小是12个字节?对象已经是8个字节,并且已经与4字节边界对齐了。
2个回答

4

垃圾回收实现要求至少12个字节。

从这里开始:http://msdn.microsoft.com/en-us/magazine/cc163791.aspx#S9

基本实例大小是由类加载器计算的对象大小,基于代码中的字段声明。如前所述,当前的GC实现需要至少12个字节的对象实例。如果一个类没有定义任何实例字段,它将带有4个字节的开销。其余的8个字节将被对象头(可能包含syncblk号码)和TypeHandle占用。

TypeHandle是指向方法表的句柄)。


1

因此,您需要8字节的开销(对象头和方法表指针)。如果您希望对象中有任何数据,则需要至少一个字节,并且由于内存以4字节块分配给对象,因此您最终会得到至少12个字节。


1
但是如果类为空呢?那么就没有额外的字段了。 - NeddySpaghetti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接