静态方法与非静态方法[重复] 5

时间:2014-04-09 15:38:31

标签: c#

我对运行时会发生什么有疑问。

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

DataMembers(int a = 10 ....)存储在对象的空间中。 如果对象的类具有虚方法,那么堆上另一个地址上的虚拟表将有8字节的vpointer。

假设我只有非静态方法。所以Object只存储一个指向我类的Type对象的Method Table的指针。

我希望我的第一部分是对的:)

如果我正确....我想知道当本机构造想要调用我的对象的非静态方法时会发生什么?!并且非静态方法确实存储在哪里?因为存储静态方法的空间必须存在差异(它们存储在调用的类型对象表中......正确!?)

我的建议:

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

1 个答案:

答案 0 :(得分:1)

每个方法的代码都存储在某处的内存中。在那里它并不是真正相关的。

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

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