Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何确定对象的大小,c#?_C# - Fatal编程技术网

如何确定对象的大小,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字节大小的倍数。