C# 如何确定实例的大小?
我已将项目设置为接受不安全代码,并使用以下帮助器类来确定实例的大小:C# 如何确定实例的大小?,c#,.net,unmanaged,unsafe,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;
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”不能作为非托管结构封送;
无法计算有意义的大小或偏移量
你知道我该怎么解决这个问题吗?
谢谢,好吧,这取决于你所说的实例的“大小”。内存中有单个对象的大小,但通常需要考虑根对象引用的任何对象。这就是根目录符合垃圾收集条件后可回收的内存量。。。但是你不能只是把它们加起来,因为这些对象可能会被多个其他对象引用,事实上,甚至在单个对象中也可能有重复引用
显示了我以前用于确定原始对象(标题+字段)大小的一些代码,忽略了由于一个对象引用的对象而产生的任何额外成本。我不会在生产代码中使用它,但它对于在不同情况下测试对象的大小非常有用。好吧,这实际上取决于实例的“大小”是什么意思。内存中有单个对象的大小,但通常需要考虑根对象引用的任何对象。这就是根目录符合垃圾收集条件后可回收的内存量。。。但是你不能只是把它们加起来,因为这些对象可能会被多个其他对象引用,事实上,甚至在单个对象中也可能有重复引用
显示了我以前用于确定原始对象(标题+字段)大小的一些代码,忽略了由于一个对象引用的对象而产生的任何额外成本。我不会在生产代码中使用它,但它对于在不同环境下测试对象的大小非常有用。谢谢Jon。我需要粗略估计每个BookSetViewModel的大小(字节),并在每个选项卡上相应地显示它。以便客户了解当前图书的大小。我会把你发来的博客回复给你。许多的Thanks@Kave:但是,为什么客户会对此感兴趣?如果几本书都引用了同一个很长的作者姓名(作为一个字符串对象),那么是否应该包含该名称?客户对内存使用感兴趣似乎很奇怪,除非你真的在写剖析器。对不起,我的意思不是一本普通的书,而是一本交易术语的书。因此,每本书都是自动唯一的。我们有一些内存问题,好像客户加载了太多的书,内存被阻塞了(仍然是WinXp,内存限制为4GB)。因此,我需要用不同的颜色渲染选项卡(书所在的选项卡),警告用户打开的大书太多,他最好关闭一些。等等,希望它能让你sense@Kave:直接对象本身的大小对于所有对象都是相同的-因此听起来您实际上对对象中的数据感兴趣。我怀疑一个精确的数字在那里不会非常有用,但是如果你计算出什么占用了大量的数据(例如大数组和字符串),那么这应该会给出一个合理的“粗略估计”。每本书都有许多子选项卡(布局)。每个布局都有不同的列。但是每个布局的底层行都是相同的。我也可以计算行数,然后根据列数计算出一个测量值……谢谢Jon。我需要粗略估计每个BookSetViewModel的大小(字节),并在每个选项卡上相应地显示它。以便客户了解当前图书的大小。我会把你发来的博客回复给你。许多的Thanks@Kave:但是,为什么客户会对此感兴趣?如果几本书都引用了同一个很长的作者姓名(作为一个字符串对象),那么是否应该包含该名称?客户对内存使用感兴趣似乎很奇怪,除非你真的在写剖析器。对不起,我的意思不是一本普通的书,而是一本交易术语的书。因此,每本书都是自动唯一的。我们有一些内存问题,好像客户加载了太多的书,内存被阻塞了(仍然是WinXp,内存限制为4GB)。因此,我需要用不同的颜色渲染选项卡(书所在的选项卡),警告用户打开的大书太多,他最好关闭一些。等等,希望它能让你sense@Kave:直接对象本身的大小对于所有对象都是相同的-因此听起来您实际上对对象中的数据感兴趣。我怀疑一个精确的数字在那里不会非常有用,但是如果你计算出什么占用了大量的数据(例如大数组和字符串),那么这应该会给出一个合理的“粗略估计”。每本书都有许多子选项卡(布局)。每个布局都有不同的列。但是每个布局的底层行都是相同的。我也可以计算行数,然后根据列数计算出一个度量值。。。