- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
出于好奇,我正在编写一个编程语言文本解析器。假设我想将 token 的不可变(在运行时)图定义为顶点/节点。这些自然是不同类型的——一些标记是关键字,一些是标识符,等等。但是它们都有共同的特征,即图中的每个标记都指向另一个标记。此属性让解析器知道特定标记后面可能有什么 - 因此该图定义了语言的形式语法。我的问题是,几年前我不再每天使用 C++,从那时起使用了很多高级语言,而我的头脑在堆分配、堆栈分配等方面完全支离 splinter 。唉,我的 C++ 生锈了。
不过,我还是想立刻爬上陡峭的山坡,并为自己设定目标,以最高效的方式用这种命令式语言定义这个图。例如,我想避免使用“new”在堆上单独分配每个 token 对象,因为我认为如果我背靠背分配这些 token 的整个图形可以这么说(以线性方式,如数组中的元素),根据引用原则的局部性,这将以某种方式有利于性能——我的意思是当整个图形被压缩以沿着内存中的“线”占用最小空间,而不是将其所有标记对象都放在随机位置时,这是一个加号?无论如何,如您所见,这是一个非常开放的问题。
class token
{
}
class word: token
{
const char* chars;
word(const char* s): chars(s)
{
}
}
class ident: token
{
/// haven't thought about these details yet
}
template<int N> class composite_token: token
{
token tokens[N];
}
class graph
{
token* p_root_token;
}
直接的问题是:创建这个图形对象的过程是什么?它是不可变的,并且它认为结构在编译时是已知的,这就是为什么我可以并且想要避免按值复制东西等等 - 应该可以用文字组成这个图?我希望我在这里说得有道理……(这不是我第一次没有。)该图将在运行时由解析器用作编译器的一部分。仅仅因为这是 C++,我也会对 C 解决方案感到满意。非常感谢您。
最佳答案
我的 C++ 也生锈了,所以我可能不知道最好的解决方案。但是既然没有其他人站出来......
你说得对,在一个区 block 中分配所有节点会给你最好的位置。但是,如果您在程序启动时动态分配图,您的堆分配很可能也会紧密地聚集在一起。
要在单个内存块中分配所有节点,我想到了两种可能性:在启动时创建并填充一个 Vector<>(缺点是现在您在内存中有两次图形信息),或者使用静态数组初始值设定项“节点 [] 图 = { ... };” .
对于这两种方法,最大的障碍是您想要创建异构对象图。一个明显的解决方案是“不要”:您可以使您的节点成为所有可能字段的超集,并使用显式“类型”成员区分类型。
如果要保留各种节点类,则必须使用多个数组/vector :每种类型一个。
无论哪种方式,节点之间的连接都必须根据数组索引进行初始定义(Node[3] 后跟 Node[10])。当然,为了更好的解析性能,您可以根据这些索引在程序启动时创建直接对象指针。
我不会将文字字符串放入任何节点(在您的情况下为“单词”):关键字、标识符和其他词汇元素的识别应该在与解析器分开的词法分析器模块中完成。我认为,如果您在词法分析器基于程序输入生成的标记与您的程序用于解析输入的语法图节点之间区分终端学,也会有所帮助。
希望对您有所帮助。
关于c++ - 如何在 C++ 中有效地实现异构不可变对象(immutable对象)的不可变图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4045977/
我的一位教授给了我们一些考试练习题,其中一个问题类似于下面(伪代码): a.setColor(blue); b.setColor(red); a = b; b.setColor(purple); b
我似乎经常使用这个测试 if( object && object !== "null" && object !== "undefined" ){ doSomething(); } 在对象上,我
C# Object/object 是值类型还是引用类型? 我检查过它们可以保留引用,但是这个引用不能用于更改对象。 using System; class MyClass { public s
我在通过 AJAX 发送 json 时遇到问题。 var data = [{"name": "Will", "surname": "Smith", "age": "40"},{"name": "Wil
当我尝试访问我的 View 中的对象 {{result}} 时(我从 Express js 服务器发送该对象),它只显示 [object][object]有谁知道如何获取 JSON 格式的值吗? 这是
我有不同类型的数据(可能是字符串、整数......)。这是一个简单的例子: public static void main(String[] args) { before("one"); }
嗨,我是 json 和 javascript 的新手。 我在这个网站找到了使用json数据作为表格的方法。 我很好奇为什么当我尝试使用 json 数据作为表时,我得到 [Object,Object]
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我听别人说 null == object 比 object == null check 例如: void m1(Object obj ) { if(null == obj) // Is thi
Match 对象 提供了对正则表达式匹配的只读属性的访问。 说明 Match 对象只能通过 RegExp 对象的 Execute 方法来创建,该方法实际上返回了 Match 对象的集合。所有的
Class 对象 使用 Class 语句创建的对象。提供了对类的各种事件的访问。 说明 不允许显式地将一个变量声明为 Class 类型。在 VBScript 的上下文中,“类对象”一词指的是用
Folder 对象 提供对文件夹所有属性的访问。 说明 以下代码举例说明如何获得 Folder 对象并查看它的属性: Function ShowDateCreated(f
File 对象 提供对文件的所有属性的访问。 说明 以下代码举例说明如何获得一个 File 对象并查看它的属性: Function ShowDateCreated(fil
Drive 对象 提供对磁盘驱动器或网络共享的属性的访问。 说明 以下代码举例说明如何使用 Drive 对象访问驱动器的属性: Function ShowFreeSpac
FileSystemObject 对象 提供对计算机文件系统的访问。 说明 以下代码举例说明如何使用 FileSystemObject 对象返回一个 TextStream 对象,此对象可以被读
我是 javascript OOP 的新手,我认为这是一个相对基本的问题,但我无法通过搜索网络找到任何帮助。我是否遗漏了什么,或者我只是以错误的方式解决了这个问题? 这是我的示例代码: functio
我可以很容易地创造出很多不同的对象。例如像这样: var myObject = { myFunction: function () { return ""; } };
function Person(fname, lname) { this.fname = fname, this.lname = lname, this.getName = function()
任何人都可以向我解释为什么下面的代码给出 (object, Object) 吗? (console.log(dope) 给出了它应该的内容,但在 JSON.stringify 和 JSON.parse
我正在尝试完成散点图 exercise来自免费代码营。然而,我现在只自己学习了 d3 几个小时,在遵循 lynda.com 的教程后,我一直在尝试确定如何在工具提示中显示特定数据。 This code
我是一名优秀的程序员,十分优秀!