每个对象的实例方法是否在内存中重复?
Are instance methods duplicated in memory for each object?
为了更清楚地说明我的问题,如果您创建一个特定 class 的数组:例如,
ExampleClass[] test = new ExampleClass[5];
我知道五个 ExampleClass
实例会为每个 class 创建每个变量的副本,但是 methods/functions 在内存中重复了 5 次,还是做每个测试只指向同一个 class 代码库?如果它为每个 class 重复,那只会浪费内存。
加载到 AppDomain 中的每个类型都将有一个 Method Table 结构,其中包含该类型定义的每个方法,以及从父类派生的虚方法(通常 Object) 和任何已实现接口定义的方法。
此方法 Table 由该对象的每个实例指向。所以每个实例不会复制该类型定义的所有方法,而是指向这个方法table结构并引用。
例如:
public class MyClass : IDisposable
{
private static void MyStaticMethod()
{
// ....
}
public void MyInstanceMethod()
{
// ....
}
public void Dispose()
{
throw new NotImplementedException();
}
}
这个 MyClass 将有一个方法 table 包括:
- 我的静态方法
- 我的实例方法
- 处置
- 以及其他派生自System.Object
的虚方法
看看漂亮的方法图table:
您可以查看有关方法的整篇文章 tables here
为了更清楚地说明我的问题,如果您创建一个特定 class 的数组:例如,
ExampleClass[] test = new ExampleClass[5];
我知道五个 ExampleClass
实例会为每个 class 创建每个变量的副本,但是 methods/functions 在内存中重复了 5 次,还是做每个测试只指向同一个 class 代码库?如果它为每个 class 重复,那只会浪费内存。
加载到 AppDomain 中的每个类型都将有一个 Method Table 结构,其中包含该类型定义的每个方法,以及从父类派生的虚方法(通常 Object) 和任何已实现接口定义的方法。
此方法 Table 由该对象的每个实例指向。所以每个实例不会复制该类型定义的所有方法,而是指向这个方法table结构并引用。
例如:
public class MyClass : IDisposable
{
private static void MyStaticMethod()
{
// ....
}
public void MyInstanceMethod()
{
// ....
}
public void Dispose()
{
throw new NotImplementedException();
}
}
这个 MyClass 将有一个方法 table 包括:
- 我的静态方法
- 我的实例方法
- 处置
- 以及其他派生自System.Object 的虚方法
看看漂亮的方法图table:
您可以查看有关方法的整篇文章 tables here