我正在寻找一种获取引用类型实例大小的方法。 sizeof仅适用于值类型。 这可能吗?
你需要Marshal.SizeOf
编辑:这是针对不安全的代码,但是sizeof()也是如此。
如果您不介意它的准确性不尽如人意,并且出于比较目的,您可以序列化对象并对其进行度量(例如以字节为单位)
编辑(我在发布后一直在思考):因为例如,它比valueof的sizeof复杂一些:引用类型可以具有对其他对象的引用,依此类推...据我所知,没有一种精确且容易的方法的...
最近我有一个类似的问题,想知道C#中Object和LinkedListNode的大小。为了解决该问题,我开发了一个程序,该程序将:
测量程序的"工作集"
分配很多对象。
再次测量"工作台"。
用差异除以分配的对象数。
在我的计算机(64位)上,我获得了以下数据:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| 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字节。
BTW乔恩·斯凯特(Jon Skeet)在我之前就已经有了上述方法的想法,并在对类似问题的回答中对此进行了说明。
请在下面的链接中参考我的答案。
通过.sos.dll调试器扩展是可能的
找出.net对象的大小
如果可以-序列化它!
1 2 3 4 5 6
| 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 |
当心Marshal.SizeOf用于不安全的代码...
我认为托管代码是不可能的,也许您可??以解释您的问题,也许有另一种解决方法