Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.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# 在.NET中包含单个整数属性的简单类的大小_C#_Debugging - Fatal编程技术网

C# 在.NET中包含单个整数属性的简单类的大小

C# 在.NET中包含单个整数属性的简单类的大小,c#,debugging,C#,Debugging,我已经看过Mario Hewardt的一个会话,其中提到一个包含integer属性的类占用16字节的空间。我想知道一个简单的跟随类的大小是如何导致16的 [StructLayout(LayoutKind.Sequential)] public class MyClass { public int Age; } 问题是整数需要4个字节的空间(对吗?),那么这12个字节又是从哪里来的呢?我还使用Marshal.SizeOf来获取类大小,结果是4: int n = Marshal.SizeO

我已经看过Mario Hewardt的一个会话,其中提到一个包含integer属性的类占用16字节的空间。我想知道一个简单的跟随类的大小是如何导致16的

[StructLayout(LayoutKind.Sequential)]
public class MyClass
{
    public int Age;
}
问题是整数需要4个字节的空间(对吗?),那么这12个字节又是从哪里来的呢?我还使用Marshal.SizeOf来获取类大小,结果是4:

int n = Marshal.SizeOf(typeof(MyClass));
//n == 4
我读过,上面的类似乎包含8字节的内部数据(这些数据到底是什么?),4字节的int值,4字节的未使用空间。那么,如果它需要16个字节,为什么Marshal.SizeOf返回4?如果需要4个字节,那么这8个字节到哪里去了?我真的很困惑。

事实上,C#中的类不仅仅是id包含的字段。 必须有一个虚拟函数表,这样您就可以使用virtual&override关键字,当然还有一些其他的东西,比如指向类型元数据的指针

事实是你不应该在意。。。重要的是“重建实例需要多少字节?”。答案是Marshal.SizeOf提供给您的:4

只对整数的4字节进行分组(是的,你是正确的,它是4字节),并且知道你想反序列化MyClass,那么你有足够的信息来完成它。

返回等价的<强>非托管< /强>类型,即等价的非托管类型(例如C++类)有多少字节如果它具有相同的现场布局和包装,则取下。请注意,此函数仅适用于具有布局类型为
Explicit
Sequential
的属性的类

CLR在托管堆上分配对象时使用的内存取决于相关CLR的内部结构。是一篇关于对象分配的CLRv2实现的文章。本质上,每个对象都有两个隐藏字段——同步块索引和类型句柄。sync块是对象与
lock(obj){}
语句一起使用时使用的内部结构。类型句柄提供关于给定实例的运行时类型信息—它包含对象的方法表等