编程语言函数在内存中的位置

Where are programming language functions in memory located?

本文关键字:位置 内存 函数 编程语言      更新时间:2023-10-16

当一个函数被调用时,比如说在c++中,由于函数指针的存在,它是否位于内存中的特定位置?如果是,具体在哪里?上课怎么样?是否为类定义存储了内存?

是的,函数位于内存中的特定位置。在虚拟内存(与物理缓存相反)的上下文中,它们存储在堆下面,并存储在名为Text的部分中名为Data(全局变量)的部分下面。所有这些都是在读取可执行文件时加载的;这一切都是用二进制完成的,二进制与汇编是一对一的,所以你永远不会在C代码中看到这一点。然而,如果您对处理器很了解,有时您仍然可以操纵它来读取代码中的代码部分。但是,它可能会导致segfault,并且通常不能写入代码部分。

就像指向变量的指针一样,函数指针指向整个堆栈中的一个位置(请参阅这个有用的网站)。实际上,有一个寄存器专门指向程序当前正在执行的指令。

类定义和成员函数在堆栈中也有特定的位置;我不完全确定,但我相信它们会进入Data。

所有这些都可能是错误的,这不是我的专长。但据我所知。。。

运行时的函数是可执行文件中的一个位置,"较低"部分可以调用该位置,从而更改堆栈。。。没关系,我不会再解释了。

类没有存储在内存中。它完全是概念性的。假设你有以下结构。

struct idk
{
    char* name;
    int index;
    void* data;
};

运行时的new idk实际上并没有查看某种定义来知道要分配什么。相反,编译器计算出了所有内容,因此最终结果是new idk在概念上等同于new char [sizeof(idk)],尽管这没有考虑对齐和打包。不管怎样,引用也没有任何形式的表来查看变量在哪里,它们也是在编译时确定的,因此int n = idk_thing.index的行为可能与int n = *((int*)(&idk_thing + sizeof(char*));类似,以此类推

当然,类的存储与结构的存储几乎完全相同,任何特定于类的函数都只是简单的旧函数,编译器再次设置了某种方式,通过访问类实例的存储来修改类中的变量。我假设这是通过向函数传递一个指向存储器的指针来完成的,该函数访问内存块的偏移量取决于它使用的变量(与我所说的结构相同)。

现在,对于函数指针,假设我至少对编译的等效函数持正确态度,我想说,函数指针只是表示加载的可执行文件中的位置的数字,这是函数的起始位置,就像char*是表示char在内存中位置的数字一样。

对于类,在C++(以及所有OOP语言,如果这很重要的话)中,它们通常是在堆上创建的。虽然如果您提交new关键字,C++可以在堆栈上创建它,但通常不建议这样做,因为类往往会占用大量资源,但这意味着如果您不显式地delete它,就会出现内存泄漏。

对于函数指针,它们通常只是堆栈中指向只读存储器中单独代码块的指针。