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

joh*_*ohn 1 c++

我特别感兴趣的是窗户,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
   }
Run Code Online (Sandbox Code Playgroud)

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

对于小字符串,没有问题.我看不出如何能的std :: string赋值比memcpy的速度更快,我敢打赌,它使用它太在后台,或类似的东西,所以这就是为什么我问实习.

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

感谢大家的帮助.

eq-*_*eq- 7

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


Sve*_*ach 6

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


Ste*_*sop 5

不是那么多,因为std::string可以修改.

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