我正在寻找一种获取引用类型实例大小的方法。sizeof仅适用于值类型。这可行吗?
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开销和4字节对齐,我估计C#中一个Object的大小为28字节,LinkedListNode为44字节。
顺便说一下,Jon Skeet在我之前就想到这种方法,并在这个答案中回答了类似的问题。
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是用于不安全代码的...
我认为对于托管代码来说这是不可能的,也许您可以解释一下您的问题,可能有其他解决方法。