代码比较:就效率而言,使用哪种代码更好?

Ami*_*mar -2 c++ string copy-constructor assignment-operator

哪个代码更适合使用:初始化字符串?

bool flag = /*function call...*/
string str = "abc";
if(flag)
  str = "bcd";
Run Code Online (Sandbox Code Playgroud)

要么

string str;
if(flag)
  str = "bcd";
else
  str = "abc";
Run Code Online (Sandbox Code Playgroud)

要么

string str("abc");
if(flag) 
  str = "bcd";
Run Code Online (Sandbox Code Playgroud)

提前致谢。

Sto*_*ica 10

这是您不应该做的微优化。C ++程序不是对人类可读格式的汇编的描述。它是程序应具有的行为的高级描述。编译器的工作是发出表现出我们指定行为的程序集。

您没有指定如何使用结果字符串,但是如果我做一些假设,然后将您的代码转换为小函数...

#include <string>

std::string foo1(bool flag) {
    std::string str = "abc";
    if(flag)
        str = "bcd";
    return str;
}

std::string foo2(bool flag) {
    std::string  str;
    if(flag)
        str = "bcd";
    else
        str = "abc";
    return str;
}

std::string foo3(bool flag) {
    std::string str("abc");
    if(flag) 
        str = "bcd";
    return str;
}
Run Code Online (Sandbox Code Playgroud)

.. Clang 8.0将为这三种情况(尤其是foo1and foo31产生几乎等效的汇编。您可以在Godbolt上看到它。

这不足为奇,因为您的三个代码片段指示的可观察行为是相同的,并且不受所选代码片段的影响。因此,不要只关注微优化。请继续详细描述最佳行为。


1 -嗯,在一个明显的分支foo2,但将在运行时被执行的代码仍然始终将是一个潜在的分配和字符串的内容的副本。这里的分支错误预测可能会有些代价,但是除非它处于一个非常紧密的循环中,否则我认为这是不值得考虑的。而且,std::string在这样的循环中使用本身可能被认为是可疑的。