.NET中的内存分配

时间:2014-11-15 11:18:46

标签: c# .net memory garbage-collection reference-type

我有一个空对象,我创建了MyCustomType类型的实例并编译了我的应用程序(x64平台)。然后我想知道我的类型有多少字节。我打开了.NET内存分析器和它,我的类型权重是 - 24字节。所以我知道在x64平台上,.NET中的任何引用类型都有16个字节的开销。无疑16!= 24.我的问题是:其他8个字节在哪里?

谢谢!

internal class MyCustomType
{

}

1 个答案:

答案 0 :(得分:1)

1 - 在x86中每个对象有8个字节的“基本”开销,在x64中有每个对象16个...因为我们可以在x86中存储一个“真实”数据的Int32并仍然有对象大小为12,同样我们可以在x64中存储两个真实数据的Int32,并且仍然具有x64的对象。

2 - 分别有12个字节和24个字节的“最小”大小。换句话说,你不能拥有只是开销的类型。注意“Empty”类如何占用与创建Object实例相同的大小...实际上有一些空余空间,因为CLR不喜欢在没有数据的对象上操作。 (请注意,没有字段的结构也会占用空间,即使对于局部变量也是如此。)

3 - x86对象填充到4字节边界;在x64上它是8个字节(就像之前一样)

4 - 默认情况下,CLR非常乐意打包相当密集的字段 - Mixed2只占用了与ThreeInt32一样多的空间。我的猜测是它重新组织了内存中的表示,以便所有字节全部来自整数...而这就是用不安全的指针快速播放的东西......但是我对这种事情说得不够舒服当然。坦率地说,我不在乎......只要一切正常,我们感兴趣的是整体尺寸,而不是精确的布局。

http://codeblog.jonskeet.uk/2011/04/05/of-memory-and-strings/