C#如何找到引用类型的大小

C#如何找到引用类型的大小,c#,memory,size,reference-type,C#,Memory,Size,Reference Type,我想知道是否有办法找到C#中引用类型的大小。我做了一些谷歌搜索,论坛上的总体想法似乎是这是不可能的。我想我应该问问你们,看看这里是否有人知道得更清楚 毕竟,分析工具必须有这样的方法?我知道通常不需要知道这些信息,但在某些情况下,了解这些信息会很有用。可以做一个粗略的估计,通过profilig跟踪使用的内存也应该是可能的。但是JIT可以自由地设置最适合的类型布局,这也可能取决于框架版本、机器配置(特别是32位与64位)、框架提供者(MS、Mono、GNU.NET等) 提前计算类似于此: 参考是3

我想知道是否有办法找到C#中引用类型的大小。我做了一些谷歌搜索,论坛上的总体想法似乎是这是不可能的。我想我应该问问你们,看看这里是否有人知道得更清楚


毕竟,分析工具必须有这样的方法?我知道通常不需要知道这些信息,但在某些情况下,了解这些信息会很有用。

可以做一个粗略的估计,通过profilig跟踪使用的内存也应该是可能的。但是JIT可以自由地设置最适合的类型布局,这也可能取决于框架版本、机器配置(特别是32位与64位)、框架提供者(MS、Mono、GNU.NET等)

提前计算类似于此:

  • 参考是32位还是64位取决于平台

  • 类实例有一个对类型信息(包括VTable等)的内部引用,再加上对所包含的每个引用类型(包括字符串或数组)的引用,再加上任何结构所使用的内存(这些结构可以进行布局,以便有效地访问,实际上留下一些未使用的内存)


因此,问题也是,您想获取类或类使用的内存以及相关数据(如字段中的字符串、数组、列表、字典等)?

Hmmm。我会使用分析工具,但我想类似的方法可能会起作用:

long before = System.GC.GetTotalMemory(true);
Foo instance = new Foo();
long after = System.GC.GetTotalMemory(true);
long consumed = after - before;

我相信这是一个“是的,我同意”的有效副本,尽管我搜索了这个问题,但没有找到任何结果(我很惊讶,这个问题还没有被问到)。我得说这个问题的标题不好,可能应该优化以便于搜索。否决投票的原因是什么?这只会测量新的空对象的大小,而不会反映现有对象的实际内存消耗。多线程解决方案中也可能存在精度问题。