代码之家  ›  专栏  ›  技术社区  ›  John Sheehan

sizeof()是否与引用类型等效?

  •  20
  • John Sheehan  · 技术社区  · 16 年前

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

    6 回复  |  直到 16 年前
        1
  •  10
  •   juan    16 年前

    如果您不介意它比完美更不精确,并且出于比较的目的,您可以序列化对象并测量它(例如,以字节为单位)。

    编辑(发布后我一直在思考) :因为它比值类型的sizeof稍微复杂一些,例如:引用类型可以引用其他对象,等等…我知道没有一种准确而简单的方法可以做到…

        2
  •  12
  •   Greg Hurlman    16 年前

    你需要 Marshal.SizeOf

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

        3
  •  4
  •   Community CDub    7 年前

    我最近有一个类似的问题,想知道C中对象和LinkedListNode的大小。为了解决这个问题,我开发了一个 program 那将:

    1. 测量程序的“工作集”
    2. 分配很多对象。
    3. 再次测量“工作组”。
    4. 将差额除以分配的对象数。

    在我的计算机(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字节对齐的。

    假设clr开销和4字节对齐,我估计C中的对象是28字节,LinkedListNode是44字节。

    顺便说一下,乔恩·斯基特在我之前就有了上述方法的想法,并在 this answer 类似的问题。

        4
  •  1
  •   juan    16 年前

    注意marshal.sizeof用于不安全代码…

    不过,我不认为托管代码是可能的,也许你可以解释你的问题,也许还有其他方法可以解决它。

        5
  •  1
  •   serhio    13 年前

    如果你能-序列化它!

    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
    
        6
  •  1
  •   Community CDub    7 年前

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

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

    Find out the size of a .net object