代码之家  ›  专栏  ›  技术社区  ›  DigitalZebra

如何确定.NET中复杂对象的大小?

  •  17
  • DigitalZebra  · 技术社区  · 16 年前

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

    5 回复  |  直到 8 年前
        1
  •  10
  •   Community Mohan Dere    9 年前

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

    要获取图形中特定对象的大小,请参见 this answer to a related question 但请注意,这是一个邪恶的黑客,完全不受支持,可能会打破(并可能已经被打破),并可能导致大规模的猫科动物灭绝在天堂。也就是说,没有“非黑客”方法可以获得精确的值,因为根据定义,这是一个实现细节——您不应该使用它。为了在调试/分析过程中了解应用程序的内存使用情况,黑客技术已经足够好了。

        2
  •  4
  •   drharris    16 年前

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

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

    反射是另一种方式,但不会暴露占用内存的任何私有成员。所以,除非我弄错了,否则没有办法真正做到这一点。

        3
  •  2
  •   user180326    16 年前

    狡猾的…

    如果两个对象指向同一个字符串变量该怎么办?哪一个“拥有”了这根绳子?在我看来,你需要模拟垃圾收集来得到一个真正的答案。不是很轻。

        4
  •  1
  •   Matt Greer    16 年前

    给予 System.Runtime.InteropServices.Marshal.SizeOf() 一枪

        5
  •  1
  •   code4life    8 年前

    先前在StackOverflow上的其他地方回答:

    Find size of object instance in bytes in c#

    您需要引入不安全的代码(由于这需要指针操作)-代码如下所示:

    static unsafe int CalcSize(object obj)
    {
        RuntimeTypeHandle th = obj.GetType().TypeHandle;
        int size = *(*(int**)&th + 1);
        return size;
    }
    

    还请记住将项目设置(项目->生成选项卡)标记为“允许不安全代码”。