-3

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

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

目的是支持所有常见的字符串操作,并为大量小字符串提供极快的速度。

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

还有其他建议吗?

4

3 回答 3

2

一直处于这种确切的情况。

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

我不会告诉你我不需要什么,或者我改变了什么。毕竟,问题不在于我。需要分析您的程序最常做的事情和不做的事情。

于 2013-08-02T14:50:10.220 回答
0

另一个建议是编写一个 String 类,其中每个 String 对象都包含一个固定大小的 char 缓冲区作为成员变量(例如 char fixedBuffer[32]),以便在常见的短字符串情况下,该类不必做任何内存分配或释放或池或诸如此类。(这样做的代价是您的 String 类的 sizeof(String) 可能会变得更大,如果您的 String 不适合固定大小的 char 数组,那么这些额外的字节将被浪费......但您提到小字符串是您在此处的特定用例)。

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

于 2013-08-02T15:21:03.780 回答
0

如果您担心速度,std::string 和 std::vector 都不是可行的方法,因为它们使用 分配内存new,不幸的是,这是一个缓慢的操作(我的机器上大约 200 到 300 个 CPU 周期)。因此,您最需要的是字符串类中的一些内存管理方案,专门针对您自己的字符串处理需求。

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

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

这些问题的答案对你能明智地做什么有着巨大的影响。

于 2013-08-02T15:18:04.680 回答