sizeof() 等效于引用类型?

sizeof() equivalent for reference types?

提问人:John Sheehan 提问时间:8/26/2008 最后编辑:Jakub ŠturcJohn Sheehan 更新时间:8/19/2011 访问量:11600

问:

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

C# .net

评论

0赞 John Sheehan 8/26/2008
这不是问题,只是一个好奇心练习。在整个请求中,我有一堆项目进入 HttpContext.Items,我只是好奇它们占用了多少内存(如果这很重要的话)。我正在经历一个“衡量一切”的阶段。
0赞 Marek 9/14/2010
还有其他方法可以确定这一点(无需修改代码)。只需使用内存分析器即可。任何体面的分析器都会显示每个特定实例分配的字节数,以及实例持有的所有内存,包括引用实例占用的内存。

答:

12赞 Greg Hurlman 8/26/2008 #1

您需要 Marshal.SizeOf

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

评论

4赞 Thomas Bratt 5/4/2009
Marshal.SizeOf 返回的字节数可能与使用的数字不同。
1赞 juan 8/26/2008 #2

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

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

10赞 juan 8/26/2008 #3

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

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

1赞 serhio 7/5/2011 #4

如果可以的话 - 序列化它!

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
4赞 GrantJ 7/13/2011 #5

我最近有一个类似的问题,想知道 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 字节。

顺便说一句,乔恩·斯基特(Jon Skeet)在我之前就有了上述方法的想法,并在对类似问题的回答中陈述了这一点。

1赞 Gomes 8/19/2011 #6

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

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

找出 .net 对象的大小