如何确定实例的大小?

时间:2011-10-03 16:51:18

标签: c# .net unmanaged unsafe

我已将项目设置为接受不安全的代码,并使用以下帮助程序类来确定实例的大小:

struct MyStruct
    {
        public long a;
        public long b;
    }

public static class CloneHelper
    {
        public unsafe static void GetSize(BookSetViewModel book)
        {
            long n = 0;

            MyStruct inst;
            inst.a = 0;
            inst.b = 0;
            n = Marshal.SizeOf(inst);
        }
}

这与结构完美搭配。但是,只要我使用传入的实际类实例:

public unsafe static void GetSize(BookSetViewModel book)
        {
            long n = 0;


            n = Marshal.SizeOf(book);
        }

我收到此错误:

  

类型'BookSetViewModel'不能作为非托管结构封送;   没有有意义的大小或偏移量可以计算出来。

知道如何解决这个问题吗? 谢谢,

1 个答案:

答案 0 :(得分:3)

嗯,这实际上取决于你的实例的“大小”是什么意思。内存中有单个对象的大小,但通常需要考虑根对象引用的任何对象。在根变得有资格进行垃圾收集之后,可以可以回收多少内存...但是你不能只是添加它们,因为这些对象可能被多个其他引用 em>对象,甚至在单个对象中也可能存在重复引用。

This blog post显示了我之前用来确定原始对象(标题+字段)大小的一些代码,忽略了由于一个对象引用的对象而导致的任何额外成本。这不是我在生产代码中使用的东西,但它可以用来试验在不同情况下对象的大小。