“std :: string + char”表达式是否会创建另一个std :: string?

时间:2016-12-27 22:56:52

标签: c++ performance memory

下面的表达式是否会创建另一个std :: string,然后将其添加到s1?

    std::string s1 = "abc", s2 = "xyz";
    s1 += s2 + 'b';

它是否应该阻止这种情况(如果没有额外的工作,它们会被添加到s1中)?

    std::string s1 = "abc", s2 = "xyz";
    s1 += s2;
    s1 += 'b';

这些规则是否也适用于“std :: string + std :: string”表达式?

2 个答案:

答案 0 :(得分:4)

涉及+的所有重载std::string运算符都会返回一个新的std::string对象。这是you finally decipher the relevant documentation时您将获得的不可避免的结论。

因此,在您的问题的第一个示例中,+运算符将返回一个临时对象,该对象将在完成紧随其后的+=操作时被销毁。

话虽如此:允许C ++编译器使用任何产生相同可观察结果的优化。 C ++编译器可能会发现,通过将代码的第一个版本转换为第二个版本,可以避免创建临时对象的可能性。我不太认为这很可能,但这是可能的。两个版本的代码之间的结果没有可观察到的差异,因此优化是公平的游戏。

但是,从技术上讲,+操作会产生一个临时的std::string对象。

答案 1 :(得分:0)

取决于具体情况。在您的代码段中没有其他对象,s2'b'将附加到已存在的s1

http://www.cplusplus.com/reference/string/string/operator+=/

例如在这种情况下:

std::string s1 = "abc";
std::string s2 = "zxy";
std::string result = s1 + s2;

result是连接s1s2

的新对象