在.NET中,有没有办法确定复杂对象的总大小?此对象由其他对象组成,可能包含对其他复杂对象的引用。此对象封装的某些对象可能是POD,其他对象可能不是。
发布于 2010-06-17 05:23:31
你所拥有的不是一个“复杂对象”,而是一个对象图。要确定它的总大小,您需要遍历该图-从一些根对象开始,使用反射枚举引用类型的字段并检索它们的值(当然,还要检查循环)。
要获取图表中特定对象的大小,请参阅this answer to a related question,但请注意,这是一个邪恶的黑客攻击,完全不受支持,可能会崩溃(并且可能已经崩溃),并可能导致天球中的小猫大规模种族灭绝。也就是说,没有“非hacky”的方法来获得精确值,因为根据定义,它是一个实现细节-你不应该使用它。对于在调试/分析期间找出应用程序的内存使用情况的目的,黑客是足够好的。
发布于 2010-06-17 05:14:42
简而言之,没有办法知道。假设所有对象都是可序列化的,您可以使用BinaryFormatter将它们序列化为二进制blob,然后读取该blob的大小。然而,这将包括一些元数据,并夸大实际的对象大小(但这将是一个合理的估计)。
对于值类型,可以使用Marshal.SizeOf()
,但它不考虑任何子对象。它会将任何内部引用类型计算为指向它的指针的大小。
反射是另一种方式,但不会公开任何占用内存的私有成员。因此,除非我错了,否则没有办法真正正确地做到这一点。
发布于 2010-06-17 05:14:42
棘手的..。
如果两个对象指向同一个字符串变量会怎样呢?哪个“拥有”字符串?在我看来,你需要模拟一个垃圾收集来得到一个真实的答案。并不是很轻。
https://stackoverflow.com/questions/3057181
复制相似问题