如何确定实例的大小
本文关键字:实例 何确定 | 更新日期: 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'不能被封送为非托管结构;无法计算有意义的大小或偏移量。
你知道我该怎么解决这个问题吗?谢谢你,
嗯,这实际上取决于你对实例"大小"的定义。这是内存中单个对象的大小,但是您通常需要考虑根对象引用的任何对象。这就是在根节点有资格进行垃圾收集之后可以可回收的内存量。但是不能把它们加起来,因为这些对象可能被多个其他对象引用,甚至在单个对象中也可能存在重复引用。
这篇博文展示了我之前用来确定原始对象(头+字段)大小的一些代码,忽略了由于一个对象引用的对象而产生的任何额外成本。我不会在产品代码中使用它,但它对于在不同情况下试验对象的大小很有用。