实现自定义字符串类以支持对大量小字符串的快速操作

时间:2013-08-02 11:40:06

标签: c++ string

我需要实现自己的字符串类。

我正在考虑使用vector<char>作为底层数据结构,但不确定它是否是一个好的设计。

目的是支持所有常见的字符串操作,并且对于大量的小字符串来说非常快。

我猜字符串池是要走的路,但需要决定基础数据结构。而且我不想使用std :: string

还有其他建议吗?

3 个答案:

答案 0 :(得分:2)

已经处于这种情况。

也就是说,我测量了代码的性能,并确定了我平台上std::string实现的瓶颈。当然,一旦我知道那个精确的瓶颈,我就可以在新课程中解决那个瓶颈问题。我很乐意这样做,因为同样的分析显示了我不需要的字符串方法。

我不会告诉你我不需要的东西,或者我改变了什么。毕竟问题不在于我。 需要分析您的计划最重要的内容,以及它不会做的事情。

答案 1 :(得分:0)

如果你担心速度,std :: string和std :: vector都不会成为现实,因为他们用new分配内存,遗憾的是这是一个慢操作(200到100的顺序)我的机器上有300个CPU周期)。所以,你需要的很可能是你的字符串类中的一些内存管理方案,它专门针对你自己的字符串处理需求。

我无法提供更详细的建议,因为我不知道您的详细需求如下:

  • 你的琴弦改变了吗?是否需要扩展/缩小缓冲区?
  • 您是否创建了一次字符串以基本保持活着直到流程结束,或者您是否有大量不断变化的字符串池?

这些问题的答案会对你明智的做法产生巨大的影响。

答案 2 :(得分:0)

另一个建议是编写一个String类,其中每个String对象包含一个固定大小的char缓冲区作为成员变量(例如char fixedBuffer [32]),以便在公共短字符串的情况下,类不必做任何内存分配或解除分配或汇集或诸如此类的东西。 (这样做的代价是你的String类的sizeof(String)可能会变大,如果你的String不适合固定大小的char数组,那些额外的字节就会被浪费...但你提到那些小字符串是你的特定用例)。

FWIW我编写了一个使用该技术的String类,尽管它的“小字符串”的概念是包含8个或更少字符的任何字符串(包括NUL终结符字节)。这样我就可以将char缓冲区与用于较长字符串的传统(char *)指针一起保存在一个联合中,因此char数组成员变量的存在不会增加sizeof(String)。但是,它可以在编译时设置为使用更大的内联字符缓冲区,但代价是使对象大小更大。我的实施可以找到herehere;它是我写的BSD-licensed library的一部分。