std :: string是否使用字符串实习?

时间:2010-10-30 19:55:27

标签: c++

我对windows,mingw特别感兴趣。

感谢。

更新: 首先,我认为每个人都熟悉字符串实习。 http://en.wikipedia.org/wiki/String_interning

其次,我的问题很详细: 为了练习,我敲了一个弦乐课。你知道什么都没有,我只是把它的大小和一个char *存储在一个类中。

我使用memcpy进行分配。

当我这样做来测量std :: string和我的字符串类的赋值速度时:

string test1 = "  65 kb text ", test2;
for(int i=0; i<1000000; i++)
   {
   test2 = test1;
   }

mystring test3 = "65 kb text", test4;
for (int i=0; i<1000000; i++)
   {
   test4 = test3
   }

std :: string是一个很大的赢家。我在赋值运算符(在我的类中)中没有做任何事情,但是用memcpy复制。我甚至没有使用“new”运算符创建一个新数组,因为我检查大小是否相等,并且只在需要时请求new。怎么样?

对于小字符串,没有问题。我不知道std :: string怎么能比memcpy更快地分配值,我敢打赌它在后台使用它,或类似的东西,所以这就是我问实习的原因。

UPDATE2: 通过使用单个字符赋值修改循环,如下所示:test2 [15] = 78,我避免了std :: string的copy-on-write效果。现在两个代码完全相同(好的,有1-2%的差异,但这可以忽略不计)。因此,如果我没有完全弄错,mingw std :: string必须使用COW。

谢谢大家的帮助。

5 个答案:

答案 0 :(得分:7)

简单地说,不。字符串实习对于可变字符串是不可行的,例如所有std :: string-objects。

答案 1 :(得分:6)

字符串实习可以由编译器仅针对出现在代码中的字符串文字来完成。如果使用字符串文字初始化std:字符串,并且某些文字出现多次,则编译器可能只在二进制文件中存储此字符串的一个副本。运行时没有字符串实习。 mingw支持编译时间字符串实习,如前所述。

答案 2 :(得分:5)

没有那么多,因为std::string是可修改的。

已知实现尝试使用写时复制,但这会导致多线程代码中的这些问题,我认为这已经过时了。它也很难正确实施 - 也许不可能?如果有人接受指向字符串中字符的指针,然后修改另一个字符,我不确定是否允许这使第一个指针无效。如果它不被允许,那么COW也是不可能的,我想,但我不记得它是如何运作的。

答案 3 :(得分:1)

不,STL中没有字符串实习。具有这样的功能不符合C ++设计理念。

答案 4 :(得分:0)

两个想法:

  • myclass是模板类吗? std::string类是模板类basic_string的typedef。这意味着编译测试函数时编译器可以访问basic_string的完整源代码而不仅仅是头文件。这些附加信息可以实现更多优化,以换取更长的编译时间。

  • 大多数c ++标准库实现都经过高度优化(而且几乎不可读)。

相关问题