C# 静态方法与非静态方法[dulicate]5

C# 静态方法与非静态方法[dulicate]5,c#,C#,我有一个关于运行时会发生什么的问题 假设我创建了一个对象。堆栈上有一个指向对象第一次存储在堆中的空间的引用 数据成员(int a=10…)存储在对象的空间中。 如果对象的类具有虚拟方法,则堆上另一个地址上的虚拟表将有一个8字节的vpointer 假设我只有非静态方法。因此,该对象只存储指向类对象类型的方法表的指针 我希望我的第一部分是正确的:) 如果我是对的……我想知道当本机构造想要调用我的对象的非静态方法时会发生什么?!非静态方法真正存储在哪里?因为存储静态方法的空间必须有所不同(它们存储在调

我有一个关于运行时会发生什么的问题

假设我创建了一个对象。堆栈上有一个指向对象第一次存储在堆中的空间的引用

数据成员(int a=10…)存储在对象的空间中。 如果对象的类具有虚拟方法,则堆上另一个地址上的虚拟表将有一个8字节的vpointer

假设我只有非静态方法。因此,该对象只存储指向类对象类型的方法表的指针

我希望我的第一部分是正确的:)

如果我是对的……我想知道当本机构造想要调用我的对象的非静态方法时会发生什么?!非静态方法真正存储在哪里?因为存储静态方法的空间必须有所不同(它们存储在调用的类型对象表中…对吧!)

我的建议是:

我的类的类型对象的Methodtable具有被调用方法的名称。 此方法在称为堆栈帧的堆栈上获得一些空间。
这个框架存储了方法的参数和一个称为This的不可见常量指针。此指针指向堆上对象的地址。

每个方法的代码都存储在内存中的某个位置。这在哪里并不重要

每当代码调用静态方法或非虚拟实例方法时,编译器都会在编译时知道需要调用的确切代码。它可以确保代码可以直接引用适当方法的代码。就这样,;完成了。调用站点只是直接引用了该方法

对于非静态虚拟方法,编译器在编译时不知道实际执行的是什么方法。在表示该对象的数据中,每个引用类型对象都有一些类型信息。调用该虚拟方法时,将检查对象的类型信息。该类型信息包括一个v形表;一个表,指示对任何给定方法应运行的代码块的引用。需要运行的方法被插入到这个表中,并弹出一个对应该运行的方法的引用