【问题标题】:Are instance methods duplicated in memory for each object?每个对象的实例方法是否在内存中重复?
【发布时间】:2015-03-01 08:14:50
【问题描述】:

为了更清楚我的问题,如果你创建一个特定类的数组:例如,

ExampleClass[] test = new ExampleClass[5]; 

我知道五个ExampleClass 实例将为每个类创建每个变量的副本,但是方法/函数是否在内存中重复了 5 次,或者每个测试都指向同一个类代码库?如果它为每个类都重复,那只会浪费内存。

【问题讨论】:

  • 能否请您发布看起来正确的代码? ExampleClass test=new test[5] 看起来很奇怪。
  • 分配数组不会分配类实例。无论是否使用数组,一个类的多个实例都使用相同的可执行代码和静态数据成员;只有 instance 数据成员(即字段)为类的每个实例提供新副本。如果您想要更具体的答案,请发布有效的 C# 代码示例并准确解释您想知道的内容。就像现在一样,很难确定你在问什么。

标签: c# class oop


【解决方案1】:

加载到 AppDomain 中的每个类型都有一个 方法表 结构,其中包含该类型定义的每个方法,以及从父级(通常是 Object)派生的虚拟方法和由任何实现的接口定义的方法。

该对象的每个实例都指向此方法表。因此,每个实例不会复制该类型定义的所有方法,而是通过引用指向该方法表结构

例如:

 public class MyClass : IDisposable
 {
        private static void MyStaticMethod()
        {
            // ....
        }
        public void MyInstanceMethod()
        {
            // ....
        }
        public void Dispose()
        {
            throw new NotImplementedException();
        }
 }

这个 MyClass 将有一个方法表,包括:

  • 我的静态方法
  • MyInstanceMethod
  • 处理
  • 以及从 System.Object 派生的其他虚方法

看看漂亮的方法表图:

你可以查看关于方法表的整篇文章here

【讨论】:

  • 这个方法表是否曾经从内存中卸载?例如如果垃圾收集器已经清除了某种类型的所有实例 - 该类型的方法表是否仍会保留在内存中?
猜你喜欢
  • 2014-09-18
  • 1970-01-01
  • 1970-01-01
  • 2013-09-15
  • 2021-08-25
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
  • 2017-04-07
相关资源
最近更新 更多