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

===============>>#1 票数:12

你需要Marshal.SizeOf

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

===============>>#2 票数:10 已采纳

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

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

===============>>#3 票数:4

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

  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字节。

在我做之前,BTW Jon Skeet有了上述方法的想法,并在这个问题的答案中说明了这一点

===============>>#4 票数:1

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

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

===============>>#5 票数: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

===============>>#6 票数:1

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

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

找出.net对象的大小

  ask by John Sheehan translate from so

未解决问题?本站智能推荐: