如何确定一个对象的大小,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)