如何确定实例的大小

本文关键字:实例 何确定 | 更新日期: 2023-09-27 18:10:31

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

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'不能被封送为非托管结构;无法计算有意义的大小或偏移量。

你知道我该怎么解决这个问题吗?谢谢你,

如何确定实例的大小

嗯,这实际上取决于你对实例"大小"的定义。这是内存中单个对象的大小,但是您通常需要考虑根对象引用的任何对象。这就是在根节点有资格进行垃圾收集之后可以可回收的内存量。但是不能把它们加起来,因为这些对象可能被多个其他对象引用,甚至在单个对象中也可能存在重复引用。

这篇博文展示了我之前用来确定原始对象(头+字段)大小的一些代码,忽略了由于一个对象引用的对象而产生的任何额外成本。我不会在产品代码中使用它,但它对于在不同情况下试验对象的大小很有用。