.NET 中的内存分配

本文关键字:分配 内存 NET | 更新日期: 2023-09-27 18:30:26

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

谢谢!

internal class MyCustomType
{
}

.NET 中的内存分配

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/