提问人:Hassan Lakhal 提问时间:9/26/2023 最后编辑:trincotHassan Lakhal 更新时间:11/11/2023 访问量:101
内存组织:类和方法存储在哪里?
Memory Organization: Where Are Classes and Methods Stored?
问:
我希望在我的编程语言中了解内存的组织,它由四个主要领域组成:堆栈、堆、代码和数据。但是,我不清楚编程语言在这些内存区域中存储类及其相关方法的位置。
有人可以解释一下哪个内存区域通常包含类及其方法的编译代码吗?是“代码”内存区域吗? 此外,我还想了解类定义和类(对象)实例在内存中的存储位置之间的区别。 是否有任何特定于语言的细微差别或优化会影响类和方法在内存中的分配方式? 我渴望更好地掌握我的编程语言中类和方法的内存管理。任何见解或参考将不胜感激。
答:
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
不存在时是否存在多态类成员函数存储为自由函数
上一个:在循环中显示堆栈值时出现问题
评论