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

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

  •  21
  • John Sheehan  · 技术社区  · 17 年前

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

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

    你需要 Marshal.SizeOf

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

        2
  •  12
  •   Greg Hurlman    17 年前

    如果你不介意它不够准确,出于比较的目的,你可以对对象进行序列化并进行测量(例如以字节为单位)

    编辑(发帖后我一直在想) :因为对于值类型来说,它比sizeof稍微复杂一些,例如:引用类型可以引用其他对象等等…据我所知,没有一种精确而简单的方法可以做到这一点。..

        3
  •  4
  •   Community CDub    8 年前

    我最近有一个类似的问题,想知道C#中Object和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#中的Object是28字节,LinkedListNode是44字节。

    顺便说一句,Jon Skeet在我之前就有了上述方法的想法,并在 this answer 对于一个类似的问题。

        4
  •  1
  •   juan    17 年前

    小心那个元帅。SizeOf用于不安全的代码。..

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

        5
  •  1
  •   serhio    14 年前

    如果可以的话,将其序列化!

    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    8 年前

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

    这可以通过.sos.dll调试器扩展来实现

    Find out the size of a .net object

    推荐文章