sizeof()等价于引用类型?

时间:2008-08-25 18:19:58

标签: c# .net

我正在寻找一种方法来获取引用类型实例的大小。 sizeof仅适用于值类型。这可能吗?

6 个答案:

答案 0 :(得分:12)

您需要Marshal.SizeOf

编辑:此 表示不安全的代码,但是,sizeof()也是如此。

答案 1 :(得分:10)

如果你不介意它不是完美的准确性,为了比较的目的,你可以序列化对象并测量它(例如以字节为单位)

编辑(我在帖子后一直在思考):因为它比valuofypes的sizeof稍微复杂一点,例如:引用类型可以引用其他对象等等......不是我知道的确切而简单的方法......

答案 2 :(得分:4)

我最近遇到了类似的问题,想知道C#中Object和LinkedListNode的大小。为了解决这个问题,我开发了一个program

  1. 测量程序的“工作集”
  2. 分配很多对象。
  3. 再次测量“工作集”。
  4. 将差异除以已分配对象的数量。
  5. 在我的电脑(64位)上,我收到了以下数据:

    Measuring Object:
    iter    working set     size estimate
    -1      11190272
    1000000 85995520        74.805248
    2000000 159186944       73.998336
    3000000 231473152       73.4276266666667
    4000000 306401280       73.802752
    5000000 379092992       73.580544
    6000000 451387392       73.3661866666667
    7000000 524378112       73.3125485714286
    8000000 600096768       73.613312
    9000000 676405248       73.9127751111111
    Average size: 73.7577032239859
    Measuring LinkedListNode<Object>:
    iter    working set     size estimate
    -1      34168832
    1000000 147959808       113.790976
    2000000 268963840       117.397504
    3000000 387796992       117.876053333333
    4000000 507973632       118.4512
    5000000 628379648       118.8421632
    6000000 748834816       119.110997333333
    7000000 869265408       119.299510857143
    8000000 993509376       119.917568
    9000000 1114038272      119.985493333333
    Average size: 118.296829561905
    Estimated Object size: 29.218576886067
    Estimated LinkedListNode<reference type> size: 44.5391263379189
    

    根据数据,分配数百万个对象的平均大小约为29.2字节。 LinkedListNode对象大约是44.5个字节。这些数据说明了两件事:

    1. 系统分配部分字节的可能性很小。字节的小数度量表示CLR分配和跟踪数百万个引用类型所需的开销。
    2. 如果我们简单地向下舍入字节数,我们仍然不太可能为引用类型提供正确的字节数。从对象的度量中可以清楚地看出这一点。如果我们向下舍入,我们假设大小是29个字节,虽然理论上可能,但由于填充,不太可能。为了提高性能,通常会对对象分配进行填充以进行对齐。我猜测CLR对象将是4字节对齐。
    3. 假设CLR开销和4字节对齐,我估计C#中的Object是28个字节,LinkedListNode是44个字节。

      BTW Jon Skeet在我做之前已经有了上述方法的想法,并在this answer中对类似问题进行了陈述。

答案 3 :(得分:1)

请注意Marshal.SizeOf是用于不安全的代码...

我不认为托管代码是可能的,也许你可以解释你的问题,可能还有另一种解决方法

答案 4 :(得分:1)

如果可以 - 序列化它!

Dim myObjectSize As Long

Dim ms As New IO.MemoryStream
Dim bf As New Runtime.Serialization.Formatters.Binary.BinaryFormatter()
bf.Serialize(ms, myObject)
myObjectSize = ms.Position

答案 5 :(得分:1)

请参阅以下链接中的答案。

可以通过.sos.dll调试器扩展

Find out the size of a .net object