首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在.NET中确定复杂对象大小的方法?

在.NET中确定复杂对象大小的方法?
EN

Stack Overflow用户
提问于 2010-06-17 05:07:16
回答 5查看 9.9K关注 0票数 17

在.NET中,有没有办法确定复杂对象的总大小?此对象由其他对象组成,可能包含对其他复杂对象的引用。此对象封装的某些对象可能是POD,其他对象可能不是。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-06-17 05:23:31

你所拥有的不是一个“复杂对象”,而是一个对象图。要确定它的总大小,您需要遍历该图-从一些根对象开始,使用反射枚举引用类型的字段并检索它们的值(当然,还要检查循环)。

要获取图表中特定对象的大小,请参阅this answer to a related question,但请注意,这是一个邪恶的黑客攻击,完全不受支持,可能会崩溃(并且可能已经崩溃),并可能导致天球中的小猫大规模种族灭绝。也就是说,没有“非hacky”的方法来获得精确值,因为根据定义,它是一个实现细节-你不应该使用它。对于在调试/分析期间找出应用程序的内存使用情况的目的,黑客是足够好的。

票数 10
EN

Stack Overflow用户

发布于 2010-06-17 05:14:42

简而言之,没有办法知道。假设所有对象都是可序列化的,您可以使用BinaryFormatter将它们序列化为二进制blob,然后读取该blob的大小。然而,这将包括一些元数据,并夸大实际的对象大小(但这将是一个合理的估计)。

对于值类型,可以使用Marshal.SizeOf(),但它不考虑任何子对象。它会将任何内部引用类型计算为指向它的指针的大小。

反射是另一种方式,但不会公开任何占用内存的私有成员。因此,除非我错了,否则没有办法真正正确地做到这一点。

票数 4
EN

Stack Overflow用户

发布于 2010-06-17 05:14:42

棘手的..。

如果两个对象指向同一个字符串变量会怎样呢?哪个“拥有”字符串?在我看来,你需要模拟一个垃圾收集来得到一个真实的答案。并不是很轻。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3057181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档