10

只是一个简短的问题,如果您有一个只有一个 1 属性和许多(非静态)方法的类,那么每次您说“新对象()”时是否会存储一个全新的对象,或者只是属性和方法在一些“公共”内存空间中,所以相同的类型可以引用吗?

因此,就实例化时间而言,大类的性能总是比小类差吗?

4

4 回答 4

4

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

于 2013-09-11T14:57:27.830 回答
4

内存分配可能确实很耗时。尽管如此,我相信更清晰、更明显的资源消耗测量方法是占用空间而不是实例化时间。

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

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

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

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

编辑

回顾一下:

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

虽然这不是我快乐的地方(我几乎不知道 ol'malloc实际上如何很好地整理内存)认为分配大量内存需要更长的时间是一种奇怪的方式,我无法理解,比如这么说

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

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

所以我会更担心内存消耗。我敢肯定时间也会受到某种影响,但可能是对数

于 2013-09-11T14:58:45.697 回答
2

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

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

于 2013-09-11T15:05:34.520 回答
0

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

于 2013-09-11T14:58:02.293 回答