我应该编写自己的数据结构来处理语义解析还是直接在编译器项目中使用STL



我发现STL使用起来太重了,比如向量、字符串等,。作为一个编译器项目,速度和内存都很重要。所以,如果我把字符串作为它的核心数据结构,很难提高翻译速度。

我想知道你在项目中处理字符串的解决方案是什么?

谢谢!

如果使用得当,STL的开销通常为。它和手工编写的C代码一样高效,因此没有什么理由出于性能原因而避免它。

然而,如果你需要STL中不存在的功能,那么是的,你可能会更好地编写自己的功能,而不是试图强迫STL类做一些它不应该做的事情。

在我的项目中有很多名字,比如"com.google.voice…",如果我使用std::string,它必须被一次又一次地切片。首先,对头节点"com"进行切片,如果找到了"com"对象,则应在该对象中递归查找其他名称"google.woice…."。有没有更好的解决方案可以避免切片串重复出现?

我会使用迭代器。

假设您有一个字符串s = "com.google.voice",然后简单地定义迭代器,指向字符串的开头,以及每个子字符串之间的分隔符。然后,您不需要创建一个全新的字符串来表示"com",只需使用指向字符串开头和结尾的两个迭代器即可。

助推。StringAlgo包含许多用于迭代器范围的常用字符串操作。

是的,自己做事会有收获
然而,有一些事情需要考虑:

  • 你知道为什么你的解决方案会比标准解决方案更好吗
  • 你对自己的平台有足够的了解吗
  • 你想花时间制定更好的解决方案吗
  • 你想冒险吗(调试,没有支持,…(
  • 你怎么知道你得到了什么/失去了什么

祝你好运。

如果遇到任何内存/性能问题(正如DeadMG所提到的,这不太可能首先发生(,我建议您研究STL的自定义分配器。我个人将STL与自定义内存分配器一起使用,这些内存分配器再次使用我自己的内存管理器(这样我就可以跟踪我使用的STL容器/字符串使用的内存(。因此,如果您关心内存使用/碎片,我建议您考虑为stl代码提供自定义分配器。

这是一个很好的资源,让我开始为STL定制内存分配:http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4079

我还记得,ogre3D有一些STL容器的自定义分配器,这可能是一个很好的例子,让你开始!

对于等效算法,您找不到更快的解决方案。除了改进像reserve((这样的字符串项的使用,正确地交换而不是复制等等,除非你有一个十年前的STL,否则你不会获得任何显著的加速。

最新更新