当调用一个函数时,让我们说在c ++中,它是否位于内存中的特定位置,因为函数指针存在?如果是这样呢?课程怎么样?是否存在用于类定义的内存?
答案 0 :(得分:2)
是的,功能位于内存中的特定位置。在虚拟内存(与物理缓存相对)的上下文中,它们存储在Heap下方,并且位于名为Text的部分中称为Data(全局变量)的部分下方。读取可执行文件时会加载所有这些内容;这都是二进制的,它与汇编一对一,所以你永远不会在你的C代码中看到这一点。但是,如果您对处理器了如指掌,有时您仍然可以将其操作为从代码中的代码部分读取。但是,它可能会导致段错误,通常您无法写入代码部分。
就像指向变量的指针一样,函数指针指向整个堆栈上的一个位置(参见this helpful site)。实际上有一个寄存器专门指向程序当前正在执行的指令。
类定义和成员函数在堆栈上也有特定的位置;我不完全确定,但我相信他们会进入数据。
答案 1 :(得分:0)
所有这些都可能是错的,这不是我的专长。但据我所知......
运行时的函数是可执行文件中的一个位置,即" lower"部分可以调用,改变堆栈......没关系,我不会试图进一步解释这个。
类未存储在内存中。这完全是概念性的。假设您有以下结构。
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
的位置。
答案 2 :(得分:-1)
对于类,在C ++(以及所有OOP语言,如果这很重要)中,它们通常在堆上创建。如果你省略new
关键字,虽然C ++ 可以在堆栈上创建它,但通常不推荐这样做,因为类往往是资源丰富,但这意味着你&# 39;如果你没有明确地delete
,就会有内存泄漏。
对于函数指针,它们通常只是堆栈中的指针,指向只读存储器中的单独代码块。