我有以下课程:
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个额外的字节?
答案 0 :(得分:4)
我相信你所看到的是需要在64位构建中对齐8字节边界(以及32位构建中的4字节边界)的效果。 40是8字节边界上最接近的尺寸> = 36。这些链接谈论对象大小:
Of Memory and strings (Jon Skeet's blog)
Benchmarking C# Struct and Object Sizes
Drill Into .NET Framework Internals to See How the CLR Creates Runtime Objects
答案 1 :(得分:1)
这是由于类型的填充适合地址边界。
这取决于您使用的类型,运行时以及用于该类型的StructLayoutAttribute。
如果您使用反射器查看Int32
,您会看到:
StructLayout(LayoutKind.Sequential)
means 可以是非连续的:
对象的成员按顺序依次布局 它们在导出到非托管内存时出现。成员是 按照规定的包装布置 StructLayoutAttribute.Pack,可以是不连续的。
StructLayoutAttribute.Pack值未设置,这意味着它为0(默认值)
值为0表示打包对齐设置为当前平台的默认值。对于x86,它通常 4byte,对于x64,它是8byte,但它在系统的基础上由CLR进行优化,这些值可能会有所不同
你可以看到它:
#pragma pack(show)