如何确定对象的大小,C#?

10

我有以下的类:

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

当我在64位系统上使用WinDbg尝试查找此类的大小时,我得到了大小为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个字节吗?


3
您需要将班级信息进行存储,这可能需要4字节。 - user1567896
1
刚刚帮你提升了声望值,超过了10的门槛 ;) - Chase Florell
请记住,string Name 也会占用内存。 - CodeZombie
3
我认为在64位构建中,它必须对齐到8字节边界。因此,您的大小将是8的倍数。 40是下一个8字节大小的倍数。 - hatchet - done with SOverflow
@user1567896 是的,只是出于兴趣。 - Kush
显示剩余2条评论
2个回答

4

1

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

这将取决于您使用的类型、运行时和类型所使用的StructLayoutAttribute

如果您查看反射器中的Int32,您会看到:

StructLayout(LayoutKind.Sequential)

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

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

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

值为 0 表示打包对齐设置为当前平台的默认值。对于 x86,默认值通常为4字节,对于 x64,默认值通常为8字节,但 CLR 根据系统进行优化,这些值可能会有所变化。

您可以使用以下命令查看它:

#pragma pack(show)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接