Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C++;口译译员 我目前正在使用一个使用C++ C++语法创建的解释器。我正在寻找存储解释器创建的变量的最佳方法_C++_Native_Interpreter - Fatal编程技术网

在C++;口译译员 我目前正在使用一个使用C++ C++语法创建的解释器。我正在寻找存储解释器创建的变量的最佳方法

在C++;口译译员 我目前正在使用一个使用C++ C++语法创建的解释器。我正在寻找存储解释器创建的变量的最佳方法,c++,native,interpreter,C++,Native,Interpreter,目前我正在使用动态数组来存储指向这些变量的指针,但肯定有更好的方法吗?也许是某种内联汇编代码来控制内存块 我不太关心可移植性,因为我愿意为每个主要操作系统重写这些代码。我只是在寻找一种方法来创建一个内存块,而不必将其锁定为单一类型。对于我目前的测试,我正在Windows上使用MingW编译器 任何想法都将受到极大的赞赏。您不需要内联汇编代码即可做到这一点。您可以使用向量作为缓冲区,并使用该缓冲区构造对象。请注意,使用此技术,您将进入手动分配管理领域,这将带来许多问题,如处理碎片。我想说,这在很大

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

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


任何想法都将受到极大的赞赏。

您不需要内联汇编代码即可做到这一点。您可以使用
向量
作为缓冲区,并使用该缓冲区构造对象。请注意,使用此技术,您将进入手动分配管理领域,这将带来许多问题,如处理碎片。

我想说,这在很大程度上取决于您的语言如何工作以及您在解释器中可以做什么。如果这是一个真正的解释器,并且您没有任何预编译步骤,那么您通常会有两种分配—堆栈和堆分配。如果您支持在堆栈上分配内容,那么应该在解释器中将其作为堆栈实现

使用
向量
作为堆栈缓冲区。跟踪输入的每个范围,在堆栈上放置一个标记。当遇到堆栈分配的变量时,增加堆栈以适应新的局部变量。如果需要,使用placement
new
初始化对象

将它添加到某种字典中,使变量名与内存空间相匹配,以便代码知道在给定上下文的情况下从何处查找名称。实际上就像一个符号表,只在运行时保存


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

我找到的最简单的解决方案是
std::map
。字符串存储变量名,
变量
boost::Variant
的类型定义。这使得代码可以像
globals[“foo”]=1一样简单(将解释器变量
foo
设置为
int,1


当然,您也可以编写自己的代码来执行大致相同的操作,但是您必须担心内存。

什么对您更有利?更快?更少的内存消耗?实现起来更优雅?您是在谈论如何管理堆,还是如何在堆栈上分配东西(如果您的语言支持的话)?当前解决方案存在什么问题?性能?@BjornPollex:我对代码的可读性并不太在意,因为我对代码的注释很好。我希望它在速度方面尽可能有效。内存使用我不太关心about@Dervall:我的代码实际上运行良好。问题是我(可能有点太过)沉迷于速度方面的效率。如果您知道任何关于管理堆或堆栈的好资源,请告诉我。老实说,我在这方面还是有点经验不足regard@user1166877:如果您真正关心速度,那么您应该做的第一件事就是分析代码,以便识别瓶颈。这将帮助您确定要优化的内容。非常感谢您的建议,我一定会仔细研究that@user1166877:要处理有关内存分配的细节,请查看boost池库: