内存组织:类和方法存储在哪里?

Memory Organization: Where Are Classes and Methods Stored?

提问人:Hassan Lakhal 提问时间:9/26/2023 最后编辑:trincotHassan Lakhal 更新时间:11/11/2023 访问量:101

问:

我希望在我的编程语言中了解内存的组织,它由四个主要领域组成:堆栈、堆、代码和数据。但是,我不清楚编程语言在这些内存区域中存储类及其相关方法的位置。

有人可以解释一下哪个内存区域通常包含类及其方法的编译代码吗?是“代码”内存区域吗? 此外,我还想了解类定义和类(对象)实例在内存中的存储位置之间的区别。 是否有任何特定于语言的细微差别或优化会影响类和方法在内存中的分配方式? 我渴望更好地掌握我的编程语言中类和方法的内存管理。任何见解或参考将不胜感激。

C++ heap-memory stack-memory

评论

3赞 Etienne de Martel 9/26/2023
这主要是用 C++ 定义的实现。
1赞 paddy 9/26/2023
权威的 C++ 书籍指南和列表中,也许您正在寻找 Stanley Lippman 的“Inside the C++ Object Model”。尽管它是在近 30 年前发布的,但您列出的所有概念都包含在其中,并且与今天相关。
0赞 Sam Varshavchik 9/26/2023
我不知道有任何普遍的定律要求在内存中为特定类型的数据或对象设置任何特定位置。
0赞 Thomas Matthews 9/26/2023
这是你的语言,把它们放在你想去的地方。
0赞 Thomas Matthews 9/26/2023
在大多数编译器中,符号(包括类、结构和模板)都进入字典。它们不会导出(除非在调试模式下)。就内存组织而言,你有 3 种内存:由链接器或编译器预先分配的内存;大型运行时内存(通常称为堆)和较小的运行时内存(也称为堆栈)。大区域通常用于执行函数后具有生存期的项目(例如链表)。较小的运行时内存通常用于生存期较短的项,例如局部变量。

答:

1赞 David Fox 9/26/2023 #1
  • 代码段:存储方法的编译代码的位置。
  • 数据段:存储静态变量和元数据的位置。
  • 堆:存储对象(实例)的位置,在某些语言(如 Python 和 Java)中,存储类元数据和方法。
  • 堆栈:存储局部变量的位置,包括对堆分配对象的引用。

细微 差别:

Java:类元数据(包括方法的字节码)存储在称为“方法区域”的特殊区域中,该区域是堆的一部分。

Python:作为一种解释型语言,Python 将类作为第一类对象处理,将类定义及其方法存储在堆中。

C++:非虚拟方法通常是内联扩展的,这意味着它们最终直接在代码段中。虚拟方法生成一个 v 表,该表存储在数据段中,其中包含指向代码段的指针。

JavaScript:由于其动态特性,类定义和方法都存储在堆中。但是,大多数现代 JavaScript 引擎都会应用各种优化,例如隐藏类和内联缓存。

评论

0赞 Hassan Lakhal 9/26/2023
谢谢你的解释。但是在 c++ 中,当定义构造时没有发生它不会发生调用 v-table 这是正确的!
0赞 David Fox 9/26/2023
在 C++ 中,v-table(虚拟表)用于虚拟函数的动态调度。但是,如果一个类没有任何虚拟函数,则不会为该类生成 v-table。这意味着此类的对象不会有指向 v 表的 v 指针。
0赞 Hassan Lakhal 9/26/2023
谢谢你的解释,我现在明白了
0赞 Hassan Lakhal 9/26/2023
不存在时是否存在多态类成员函数存储为自由函数