如何确定对象的大小,c#?
我有以下课程:如何确定对象的大小,c#?,c#,C#,我有以下课程: public class MyClass { public string Name { get; set; } public int Age { get; set; } public double Amount { get; set; } } 当我试图通过使用WinDbg在64位系统上找出这个类的大小时,我得到的大小是40 就我所读到的我的班级应该具备的条件而言,我无法理解 8 bytes for SyncBlo
public class MyClass
{
public string Name { get; set; }
public int Age { get; set; }
public double Amount { get; set; }
}
当我试图通过使用WinDbg在64位系统上找出这个类的大小时,我得到的大小是40
就我所读到的我的班级应该具备的条件而言,我无法理解
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是8字节边界上最接近的大小>=36。这些链接讨论对象大小:
这是由于类型的填充适合地址边界 这将取决于您正在使用的类型、运行时以及用于该类型的 如果使用反射器查看
Int32
,您将看到:
StructLayout(LayoutKind.Sequential)
这意味着它可以是非连续的:
对象的成员按顺序排列
它们在导出到非托管内存时显示。成员是
根据图纸中规定的包装进行布置
StructLayoutAttribute.Pack,并且可以是非连续的
该值未设置这意味着它是0(默认值)
值为0表示包装对齐方式设置为当前平台的默认对齐方式。对于x86,它通常是,对于x64,它通常是4字节,但是它是由系统基础中的CLR优化的,这些值可能会有所不同
您可以通过以下方式查看:
#pragma pack(show)
你的班级信息也需要存储。这可能是4字节。刚刚让您超过了10次重复的阈值;)请记住,
字符串名
会消耗内存too@user1567896这是由TypeHandle处理的。我认为在64位构建中,它必须与8字节边界对齐。所以你的尺码是8的倍数。40是下一个8字节大小的倍数。