正在制作多少std :: string副本?

时间:2012-03-30 18:54:26

标签: c++ string

string str1("someString");
string str2 = string(str1);//how many copies are made here
    //copy2 = copy1?

当您使用字符串(otherString)分配字符串时,是否会复制括号中的值,然后将该值复制到变量?

2 个答案:

答案 0 :(得分:9)

从技术上讲,可以有两个副本,但在现实生活中,你只做一个副本。也就是说,编译器将意识到不需要临时文件并优化掉副本。

答案 1 :(得分:3)

在现实生活中会有一个副本,但理论上它取决于编译器实现的语言版本。

string(str1)将创建一个str1的副本。

在C ++ 98/03中,编译器理论上会使用复制初始化从该临时值初始化str2,因此理论上将在该点进行第二次复制。实际上,你可能很难找到一个不会忽略其中一个复制操作的编译器(至少如果启用了优化)。

在C ++ 11中,std::string有一个移动构造函数(一个采用右值引用的构造函数),它应该用于初始化str2,因此理论上不应该发生第二个副本。