我需要实现自己的字符串类。
我正在考虑使用vector<char>
作为底层数据结构,但不确定它是否是一个好的设计。
目的是支持所有常见的字符串操作,并且对于大量的小字符串来说非常快。
我猜字符串池是要走的路,但需要决定基础数据结构。而且我不想使用std :: string
还有其他建议吗?
答案 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)。但是,它可以在编译时设置为使用更大的内联字符缓冲区,但代价是使对象大小更大。我的实施可以找到here和here;它是我写的BSD-licensed library的一部分。