如何确定一个对象的大小,c#?

我有以下课程:

public class MyClass { public string Name { get; set; } public int Age { get; set; } public double Amount { get; set; } } 

当我试图通过使用WinDbg在64位系统上找出这个类的大小时,我得到的大小为40,我无法理解,只要我读过MyClass应该有的

 8 bytes for SyncBlock 8 bytes for TypeHandle 8 bytes for string reference 4 bytes for Int32 8 bytes for double = 36 bytes 

我没有10个声誉,这就是为什么我无法发布图片。 任何人都知道为什么WinDbg显示4个额外的字节?

我相信你所看到的是64位构建中需要与8字节边界对齐的事物的影响(以及32位构建中的4字节边界)。 40是最接近的大小> = 36,它位于8字节边界上。 这些链接谈论对象大小:

内存和字符串(Jon Skeet的博客)

对C#结构和对象大小进行基准测试

深入了解.NET Framework内部,了解CLR如何创建运行时对象

C#字符串占用多少内存

这是由于类型的填充适合地址边界。

这取决于您使用的类型,运行时和用于该类型的StructLayoutAttribute 。

如果你用reflection器看Int32 ,你会看到:

 StructLayout(LayoutKind.Sequential) 

这意味着它可以是不连续的

对象的成员按照导出到非托管内存时出现的顺序按顺序排列。 成员根据StructLayoutAttribute.Pack中指定的包装进行布局,并且可以是不连续的。

StructLayoutAttribute.Pack值未设置,这意味着它为0(默认值)

值为0表示打包对齐设置为当前平台的默认值。 对于x86 通常为4byte,对于x64 通常为8byte,但它在系统基础上通过CLR进行优化,这些值可能会有所不同

你可以看到它:

 #pragma pack(show)