【发布时间】:2017-08-05 02:59:26
【问题描述】:
我的任务是使用一些通过网络以文本形式出现的复杂数据调用 C API 函数。人们可能会想到某种形式的 RPC。函数调用非常频繁,因此性能要求非常严格。目前我直接用手动编写的解析器将输入流解析为对应的POD结构。问题是这个解析器是巨大的。是的,有时我会在其中发现错误。我想尝试切换到 boost 以降低代码的复杂性。希望我也可以提高性能,以防我可以使用内存池。在当前的解决方案中,考虑到所有这些都是多线程的,添加这种复杂性看起来令人生畏。
简化的输入数据类似于functionName({x,x,x,{x,x,x},<null>,x}),其中每个x 是某种类型的原始值或文本字符串(表示为"blah" 或<null>)。每个缺失的结构都由<null> 表示。
输出数据是一个POD结构。在字符串或嵌套结构作为字段的情况下,指向已分配数据的指针存储在外部数据中。如果值丢失,它可能为 null。
通过 SO 答案和 boost 文档进行挖掘,我找不到如何有效地完成这项任务,即在将结构解析为一些内部“boost-friendly”形式后,没有将其重建为 POD。
再次重复主题,问题是如何解析具有指针的嵌套 POD 结构?
感谢任何帮助。
【问题讨论】:
-
我曾经实现过类似的功能 - 出于数据序列化的目的(我想将 C++ 对象保存到文件中,然后将它们加载回来)。加上对修补(代码版本控制)的支持导致了一个小模块,但它并不大。但我为此目的使用了纯 C++...
-
发布一些你认为应该做你想做的事情的代码。您将需要保留一个“全局”上下文对象,用于记录之前是否见过对象。
-
您可能想看一下 capnproto.org ,由以前在 Google Protobuf 工作的 Kenton Varda 编写。使用其他人为您维护的现有解决方案有很多话要说:)
标签: c++ parsing boost boost-spirit