实例化一个对象时,它是否全部存储在内存中?

时间:2013-09-11 14:53:00

标签: c# object memory

简单的问题,如果你有一个只有一个属性的类,以及许多(非静态)方法,每次你说'new object()'或者只是属性时,都会存储一个全新的对象,以及某些“常见”内存空间中的方法,所以同一类型可以引用它?

因此,在实例化时间方面,一个大类的表现总是比一个小类差吗?

4 个答案:

答案 0 :(得分:3)

分享方法。在所有其他条件相同的情况下,使用多种方法实例化一个类与实例化一个具有很少方法的类几乎相同。这是它们的非静态字段以及构造函数执行的工作量(以及一些其他次要因素),它们决定了创建成本。

答案 1 :(得分:2)

内存分配可能确实耗费时间。 尽管如此,我认为更清洁,更明显的资源消耗测量将占用空间而非实例化时间。

正如你已经说过的那样,方法是这样的, 静态与否,只占用一次内存空间。 this引用只是一个隐藏参数,它从调用者发送到被调用的代码,就像任何其他参数一样,最后,所有方法都只是简单的函数(或例程)。

以简单的方式放置它,所有静态字段也是如此。 不要考虑属性。它们只是最终访问字段的方法的高级包装器。

实例字段是每个实例占用空间的内容。 但还有其他一些东西,比如运行时类型信息也可以分配。

简而言之,您的假设是正确的。

修改

正如回顾:

  • 如果“大类”是指一个定义了很多方法的类,那么不会,实例化时间不会受到影响。
  • 另一方面,如果用那个术语来表示一个定义了很多实例字段的类,那么实例化时间会受到影响。

虽然这不是我喜欢的地方(我几乎不知道'malloc实际上如何设法对记忆进行碎片整理)认为分配大量内存会花费更长时间是一种奇怪的方式我可以不要说我的手指,就像说那样

“添加数字1024和2048比添加数字3和4需要更长的时间”

(假设所有4个数字都存储在相同数字类型的变量中)。

所以我会更担心内存消耗。我确信时间也会受到影响,但也许以对数方式

答案 2 :(得分:2)

实例字段是存储在对象本身中的唯一内容。方法存储在类型中,这意味着它们只存在于一个地方。

实际上,实例方法只是接受实例作为参数的静态方法的语法糖(在IL级别)。

答案 3 :(得分:0)

我想你会找到你需要的信息(可能更多)here。实例方法的代码将被共享。