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

时间:2013-11-19 23:16:26

标签: 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个额外的字节?

2 个答案:

答案 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

How Much Memory Does a C# String Take Up

答案 1 :(得分:1)

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

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

如果您使用反射器查看Int32,您会看到:

StructLayout(LayoutKind.Sequential)

means 可以是非连续的

  

对象的成员按顺序依次布局   它们在导出到非托管内存时出现。成员是   按照规定的包装布置   StructLayoutAttribute.Pack,可以是不连续的。

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

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

你可以看到它:

#pragma pack(show)