我正在寻找一种方法来获取引用类型实例的大小。 sizeof仅适用于值类型。这可能吗?
答案 0 :(得分:12)
编辑:此 表示不安全的代码,但是,sizeof()也是如此。
答案 1 :(得分:10)
如果你不介意它不是完美的准确性,为了比较的目的,你可以序列化对象并测量它(例如以字节为单位)
编辑(我在帖子后一直在思考):因为它比valuofypes的sizeof稍微复杂一点,例如:引用类型可以引用其他对象等等......不是我知道的确切而简单的方法......
答案 2 :(得分:4)
我最近遇到了类似的问题,想知道C#中Object和LinkedListNode的大小。为了解决这个问题,我开发了一个program:
在我的电脑(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开销和4字节对齐,我估计C#中的Object是28个字节,LinkedListNode是44个字节。
BTW Jon Skeet在我做之前已经有了上述方法的想法,并在this answer中对类似问题进行了陈述。
答案 3 :(得分:1)
请注意Marshal.SizeOf是用于不安全的代码...
我不认为托管代码是可能的,也许你可以解释你的问题,可能还有另一种解决方法
答案 4 :(得分: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
答案 5 :(得分:1)