复杂语言中类型的内存管理
Memory management for types in complex languages
我在编写内存管理时遇到了一个小问题,这个问题涉及静态类型复杂语言编译器中类型的内部表示。考虑一下C++中的一个简单片段,它可以轻松地演示一个引用自身的类型。
class X {
void f(const X&) {}
};
类型之间可以有几乎无限复杂的关系。那么,作为一个编译器过程,你如何确保它们被正确地收集?
到目前为止,我已经决定垃圾收集可能是正确的方法,我对此并不太满意,因为我想用C++编写编译器,或者,只留下它们,在需要它们的编译阶段(有一个非常固定的生命周期(内永远不要收集它们,然后再全部收集。问题是,如果你有很多复杂的类型,你可能会以这种方式失去很多内存。
内存管理很简单,只需为每个声明范围提供一些表类型名称->类型描述符即可。无论嵌套有多复杂,类型都是通过名称唯一标识的。即使是递归类型仍然只是一个类型。正如tp1正确指出的那样,你通常会进行多次传球来填补所有空白。例如,您可以在第一次遍历中检查类型名称是否已知,然后计算所有链接,稍后再计算类型。
请记住,像C这样的语言并没有真正复杂的类型系统——即使它们有指针(允许递归类型(,也没有太多的类型计算
我认为您可以通过使用单独的对象来表示声明和定义来从依赖关系图中删除循环。假设一个类似于C++的类型系统,那么您将有一个层次依赖:
- 函数的定义取决于类型定义和函数declaration
- 类型定义取决于函数和类型声明(以及包含类型的定义(
- 函数声明依赖于类型的声明
在您的示例中,依赖关系图是f_def -> X_def -> f_decl -> X_decl
。
由于图形中没有循环,您可以使用简单的引用计数来管理对象。
相关文章:
- 当vector是tje全局变量时,c++中vector的内存管理
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- C++将字符串传递给 C 库以进行内存管理
- 从函数返回时C++内存管理
- 函数指针和 lambda 的内存管理
- 自定义内存管理器在发布模式下工作正常,但在调试模式下则不然
- C++中的内存管理
- C和C++中的内存管理有什么区别
- 字符 * 未从重载运算符或内存管理问题正确返回
- 如何在源代码中使用执行策略检测 C++17 的扩展内存管理算法的可用性?
- 底层指针和内存管理
- 智能指针,避免使用QNetworkAccessManager时进行手动内存管理
- c++中的内存管理问题
- 使用矢量时的内存管理
- 循环和内存管理中的指针算术C++?
- C++堆栈内存管理问题
- C 内存管理中的课程如何管理 - 研究
- 不可变数据模型的内存管理
- C++ 使用数组初始化时的 STL 向量内存管理
- SFML 纹理内存管理