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

===============>>#1 票数:12

你需要Marshal.SizeOf

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

===============>>#2 票数:10 已采纳

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

编辑(我在帖子后一直在思考) :因为它比valuofypes的sizeof稍微复杂一点,例如:引用类型可以引用其他对象等等......我知道这不是一个确切而简单的方法的...

===============>>#3 票数:4

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

在我做之前,BTW Jon Skeet有了上述方法的想法,并在这个问题的答案中说明了这一点

===============>>#4 票数:1

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

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

===============>>#5 票数: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

===============>>#6 票数:1

请参考以下链接中的答案。

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

找出.net对象的大小

  ask by John Sheehan translate from so

未解决问题?本站智能推荐:

6回复

可空类型是引用类型吗?

当我将int声明为可空时 i在这里成为参考类型吗?
1回复

分配为空引用类型

请理解,我已经看到并关注该问题,但是不确定如何彻底解决该问题。 我试图运行我的Add方法,迭代直到找到我的密钥或当前节点为null,然后将对该引用的引用返回给该节点并分配它是否为null。 我的代码(请参见add方法中的注释): TraverseDown方法接受Node byRef的
4回复

.NET中的引用类型

.NET中引用类型如何存储在堆上? (表示为哪种形式)如果应用程序中有2个同名的对象,这些对象将如何存储在堆中?
2回复

包含引用类型的Struct

struct是一个值类型,所以如果我将一个struct分配给另一个struct,它的字段将被复制到第二个struct中。 但是,如果结构的某些字段是引用类型会发生什么? 输出是: 为什么address1的IP (字符串,即参考类型)不会改变? 如果我用IPAddress替换s
13回复

C#中的引用类型

考虑以下代码: 很显然,当分配person1到person2和Name的属性person2改变时, Name的person1也会随之改变。 person1和person2具有相同的引用。 为什么当person2 = null , person1变量也不会为null?
1回复

从ValueType继承引用类型

我们知道在框架中,许多valuetypes viz Int32,Double等都继承自引用类型,即Abstract类(System.ValueType和intern System.Object类)。 现在我想知道我是否可以通过C#代码明确地模拟类似的概念。 是的,我完全知道C#编译器规则会阻
7回复

为什么代表引用类型?

关于接受的答案的简要说明 :我不同意Jeffrey的答案的一小部分,即,由于Delegate必须是引用类型,因此所有委托人都是引用类型。 (根本就不是多级继承链排除值类型;例如,所有枚举类型都继承自System.Enum ,而System.Enum继承自System.ValueType ,后者
4回复

为什么值类型在引用类型的属性时就像引用类型一样?

为什么这样: 造成 由于bool是一个值类型,我希望bc2.Value == false除非bc2.Value被装箱并存储在堆上。 我在Stack Overflow上找到了这个方法来判断该值是否已装箱 但它表示它没有盒装。 我现在有些困惑,有人可以向我解释一下吗?
2回复

动态-是引用类型还是值类型?

我认为它是引用类型,因为...您可以实例化以下内容:
6回复

Guid被认为是值类型还是引用类型?

Guids是使用new关键字创建的,这使我认为它是一种引用类型。 它是否正确? Guid uid = new Guid(); Guids是否存储在堆上?