【问题标题】:When instantiating an object, does it all get stored in memory?实例化一个对象时,它是否都存储在内存中?
【发布时间】:2013-09-15 16:13:48
【问题描述】:

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

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

【问题讨论】:

  • 请同时检查我刚刚制作的 EDIT。我真的不太了解内存分配但是..我想强调一下时间消耗和内存空间消耗之间的区别

标签: c# object memory


【解决方案1】:

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

【讨论】:

  • 属性只是一对方法,通常带有一个支持字段。此字段是实际存储在对象中的属性的唯一部分。它就像一个普通的领域。
  • 属性不是非静态字段的对立面。顺便说一句:属性本身可以是静态的,也可以不是。
  • 你说得对,我需要停止在这种情况下使用属性,因为它通常只是一个 getter + setter。字段(或我认为的变量)更好。
  • @user2713516 字段有时也称为成员变量。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    内存分配可能确实很耗时。 不过,我相信更清晰、更明显的资源消耗衡量标准是占用空间而不是实例化时间。

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

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

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

    总之,你的假设是正确的。

    编辑

    作为回顾:

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

    虽然这不是我快乐的地方(我几乎不知道 malloc 实际设法对内存进行碎片整理有多好)认为分配大量内存需要更长的时间是一种奇怪的方式,我不能把我的手指放在上面,就像这样说

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 非虚拟实例方法可以被认为只是 IL 中的语法糖。但是虚方法(和接口方法)的行为不同。
      猜你喜欢
      • 2021-08-25
      • 1970-01-01
      • 2021-04-15
      • 1970-01-01
      • 2015-03-01
      • 2010-12-29
      • 1970-01-01
      • 2013-11-07
      • 2020-04-20
      相关资源
      最近更新 更多