提问人:John Sheehan 提问时间:8/26/2008 最后编辑:Jakub ŠturcJohn Sheehan 更新时间:8/19/2011 访问量:11600
sizeof() 等效于引用类型?
sizeof() equivalent for reference types?
答:
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 的大小。为了解决这个问题,我开发了一个程序,它可以:
- 测量程序的“工作集”
- 分配大量对象。
- 再次测量“工作集”。
- 将差值除以已分配对象的数量。
在我的计算机(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 个字节。此数据说明了两件事:
- 系统不太可能分配部分字节。字节的小数度量表示 CLR 分配和跟踪数百万个引用类型所需的开销。
- 如果我们只是将字节数向下舍入,我们仍然不太可能为引用类型提供正确的字节计数。这从对象的度量中可以清楚地看出。如果我们向下舍入,我们假设大小为 29 个字节,虽然理论上是可能的,但由于填充,这不太可能。为了提高性能,通常会填充对象分配以进行对齐。我猜 CLR 对象将是 4 字节对齐的。
假设 CLR 开销和 4 字节对齐,我估计 C# 中的 Object 为 28 字节,LinkedListNode 为 44 字节。
顺便说一句,乔恩·斯基特(Jon Skeet)在我之前就有了上述方法的想法,并在对类似问题的回答中陈述了这一点。
1赞
Gomes
8/19/2011
#6
请在下面的链接中参考我的答案。
可以通过 .sos.dll 调试器扩展实现
下一个:.NET 多维数组打印
评论