关于引用类型的c#:sizeof()是否等效?

关于引用类型的c#:sizeof()是否等效?

sizeof() equivalent for reference types?

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


你需要Marshal.SizeOf

编辑:这是针对不安全的代码,但是sizeof()也是如此。


如果您不介意它的准确性不尽如人意,并且出于比较目的,您可以序列化对象并对其进行度量(例如以字节为单位)

编辑(我在发布后一直在思考):因为例如,它比valueof的sizeof复杂一些:引用类型可以具有对其他对象的引用,依此类推...据我所知,没有一种精确且容易的方法的...


最近我有一个类似的问题,想知道C#中Object和LinkedListNode的大小。为了解决该问题,我开发了一个程序,该程序将:

  • 测量程序的"工作集"
  • 分配很多对象。
  • 再次测量"工作台"。
  • 用差异除以分配的对象数。
  • 在我的计算机(64位)上,我获得了以下数据:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    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个字节。此数据说明了两件事:

  • 系统分配部分字节的可能性很小。字节的小数位数表示CLR分配和跟踪数百万个引用类型所需的开销。
  • 如果仅简单地舍入字节数,对于引用类型,我们仍然不太可能拥有正确的字节数。从对象的角度来看这很明显。如果四舍五入,我们假定大小为29个字节,尽管理论上可能,但由于填充而不太可能。为了提高性能,通常出于对齐目的填充对象分配。我想CLR对象将是4字节对齐的。
  • 假设CLR开销和4字节对齐,我估计C#中的Object为28字节,LinkedListNode为44字节。

    BTW乔恩·斯凯特(Jon Skeet)在我之前就已经有了上述方法的想法,并在对类似问题的回答中对此进行了说明。


    请在下面的链接中参考我的答案。

    通过.sos.dll调试器扩展是可能的

    找出.net对象的大小


    如果可以-序列化它!

    1
    2
    3
    4
    5
    6
    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

    当心Marshal.SizeOf用于不安全的代码...

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


    推荐阅读