【问题标题】:Static Methods Vs Non-Static Methods[dulicate]5静态方法与非静态方法[重复]5
【发布时间】:2014-04-10 00:21:55
【问题描述】:

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

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

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

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

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

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

我的建议:

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

【问题讨论】:

    标签: c#


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-21
      相关资源
      最近更新 更多