从 class 对象开始执行时函数指针分配在哪里?

Where the function pointer is allocated when its begin executed from an class object?

我已经阅读了一些关于堆栈和堆的文章和博客。现在,我正在阅读 this 文章以获取有关内存分配的更多信息。作者说。

方法调用时会发生什么?

some space is allocated for information needed for the execution of our method on the stack (called a Stack Frame). This includes the calling address (a pointer) which is basically a GOTO instruction so when the thread finishes running our method it knows where to go back to in order to continue execution.

现在我很困惑它说一些内存被分配给堆栈中的函数调用信息。但是,当在 class 中声明该函数时会发生什么?并被那个 class 对象

执行
public class MyClass()
{
    public void publicFunc()
    {
        privateFunc();
    }

    private void privateFunc()
    {
        //some Code
    }
}


MyClass cls = new MyClass();
cls.MyFunction();

现在,我想知道如果MyClass的对象存储在堆存储中,那么publicFunc()privateFunc()函数指针将存储在哪里? MyClass的对象分配在栈中还是在同一个堆中?

请记住,classes 对 class 的 定义 实例 的class。我们可以看到在这行代码中:

MyClass cls = new MyClass();

该代码会导致三件事发生:创建类型为 MyClass 的新 cls 变量。但是 cls 的核心只是一个指针,因此还会在堆上创建一个新的 MyClass 对象。最后,cls 变量被设置为引用新对象。这里值得注意的是,所示的 MyClass 对象只不过是一个 shell... 除了从基础 Object 类型继承的内容之外,没有其他数据成员。但是,MyClass type 与刚刚创建的对象不同。

MyClass type 确实有一些函数成员。与 classes 一样,函数定义和对特定函数的调用之间存在某种区别。函数定义不是对象实例的一部分;它们是已编译程序的一部分……程序内存的一部分,程序首次启动时在堆栈上分配。创建对象或调用函数时,不会为函数本身分配新内存。

实际发生的是程序会将一个新条目压入调用堆栈,指示函数已被调用。这不同于为函数本身分配内存;同样,它类似于 type/class 和 type/class 实例之间的区别。调用堆栈记录将包含函数使用的任何堆栈变量的 space。例如,如果 privateFunc() 函数将一个整数声明为函数的一部分,那么在该整数的堆栈帧中就会有 space。如果它声明了一个 class 变量,那么 class 变量的堆栈帧上会有 space ......但是 不是 引用的对象由变量;它只会将 space 放在堆栈上以保存 "pointer" ,该 "pointer" 引用用于变量的任何 class 类型。

在函数结束时,程序从堆栈中拉取条目以查看跳回到何处,以便程序可以从调用函数之前停止的地方继续执行。当堆栈中没有更多条目时,程序将退出。