编程语言函数在内存中的位置
Where are programming language functions in memory located?
当一个函数被调用时,比如说在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
它,就会出现内存泄漏。
对于函数指针,它们通常只是堆栈中指向只读存储器中单独代码块的指针。
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 内存所有位置 wxWidgets
- 为什么字符串的 move() 会改变内存中底层数据的位置?
- 如何在不等待检索的情况下获取C++中的内存位置?
- 内存中类位置的成员是否取决于类成员在类定义中的位置?
- 向量的内存位置不连续
- 如何根据C++在同一内存位置重新初始化 C# 中的对象(还是自动完成)?
- 常量引用的内存位置
- C++强制变量到一个固定的内存位置
- 为什么未初始化的内存位置的值给出 -842150451 的值?
- 为什么存储在内存位置的值会发生变化?
- 在特定内存位置构造 c++ 对象
- 如果不初始化结构中的向量,它会自动为空还是具有随机内存位置的值?
- 如何识别内存泄漏的位置
- 内存位置出现Microsoft C++异常:std::out_of_range
- 函数,返回变量c++占用的内存位置的大小
- 在尝试使用CUDA分配内存时,我遇到了访问冲突写入位置错误
- delete如何知道对象在内存中的起始位置
- 无法在 Opencv 中显示图像导致内存位置
- 如何修复<程序名称>中的"<内存位置>未处理的异常。Visual Studio 2017 中的访问冲突写入位置<内存位置>"