在C ++解释器中动态分配变量的最佳方法

时间:2012-02-27 07:47:16

标签: c++ native interpreter

我正在创建一个使用伪c ++语法创建的解释器。我正在寻找存储由解释器创建的变量的最佳方法。

目前我正在使用存储指向这些变量的指针的动态数组,但肯定有更好的方法吗?也许某种内联汇编代码来控制内存块?

我不太关心可移植性,因为我愿意为每个主要操作系统重写这些代码片段。我只是在寻找一种方法来创建一个内存块,而不会被锁定到一个类型。对于我目前的测试,我在Windows上使用MingW编译器。

任何想法都会受到高度赞赏。

3 个答案:

答案 0 :(得分:3)

我说这在很大程度上取决于你的语言在翻译中的表现方式。如果这是一个真正的解释器并且您没有任何预编译步骤,那么您通常会有两种分配 - 堆栈和堆分配。如果您支持在堆栈上分配内容,则应在解释器中将其实现为堆栈。

使用vector<char>作为堆栈缓冲区。跟踪输入的每个范围,在堆栈上放置标记。遇到堆栈分配变量时,请增大堆栈以容纳新的局部变量。如果需要,请使用展示位置new初始化对象。

将其添加到某种字典中以将变量名称与内存空间相匹配,以便您的代码知道在给定上下文的位置找到名称的位置。就像符号表一样,只保留在运行时。

一旦遇到范围结束,您将弹出所有本地分配的符号的堆栈,并在必要时调用析构函数。同时从符号表中删除所有条目,因为它们不再在范围内。这样就可以完全避免堆分配完全用于堆上没有使用的对象。

答案 1 :(得分:1)

您不需要内联汇编程序代码来执行此操作。您可以使用vector<char>作为缓冲区,并使用placement new在其中构建对象。请注意,使用此技术,您将进入手动分配管理领域,这会带来一系列问题,例如处理碎片。

答案 2 :(得分:1)

我找到的最简单的解决方案是std::map<std::string, Variant>。字符串存储变量名称,Variantboost::variant<all-interpreter-types>的typedef。这样,代码就像globals["foo"]=1;一样简单(将解释器变量foo设置为int, 1)。

当然,你可以编写自己的代码大致相同,但必须担心内存。