C++ 代码比较:在效率方面,哪种代码更适合使用?

C++ 代码比较:在效率方面,哪种代码更适合使用?,c++,string,copy-constructor,assignment-operator,C++,String,Copy Constructor,Assignment Operator,使用哪种代码更好:初始化字符串 bool flag = /*function call...*/ string str = "abc"; if(flag) str = "bcd"; 或 或 提前感谢。这是一个你不应该做的微优化。C++程序是强>不/强>以人类可读格式描述程序集。它是对程序应该具有的行为的高级描述。编译器的任务是发出显示我们指定行为的程序集 您没有指定如何使用结果字符串,但是如果我做一些假设并将代码转换为小函数 #include <string> std::st

使用哪种代码更好:初始化字符串

bool flag = /*function call...*/
string str = "abc";
if(flag)
  str = "bcd";


提前感谢。

这是一个你不应该做的微优化。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;
}
#包括
std::字符串foo1(bool标志){
std::string str=“abc”;
国际单项体育联合会(旗)
str=“bcd”;
返回str;
}
std::字符串foo2(bool标志){
std::字符串str;
国际单项体育联合会(旗)
str=“bcd”;
其他的
str=“abc”;
返回str;
}
std::字符串foo3(bool标志){
std::string str(“abc”);
国际单项体育联合会(旗)
str=“bcd”;
返回str;
}
。。Clang8.0将为这三种情况(尤其是
foo1
foo3
)1生成几乎相同的程序集。你可以在电视上看到它

这并不奇怪,因为您的三个代码段指示的可观察行为是相同的,并且不受您选择的代码段的影响。因此,不要纠缠于微观优化。专注于在更大范围内描述最佳行为


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

bool flag = foo();
string str { flag ? "bcd" : "abc" };
flag
确定调用
std::string::string(const char*)
时使用的字符串文本。但是有一个调用,一个字符串对象正在构造,并且没有赋值

[编辑]
翻转字符串文本。在C++中,对于 < < /C> >构造和::/Cuth>构造,“true”情况是先出现的,然后是“false”情况。但是问题是相反的,
flag==false
的情况下,“abc”首先出现。

这个问题更适合@MarkusDeibel No,它会因为缺少上下文而关闭。我想你应该对此进行基准测试。我怀疑结果会有所不同,是您使用的字符串是40char而不是3 char
string str=flag?“bcd”:“abc”但对于案例2,它不是相同的程序集。如果仔细观察,在案例2中有两个调用
string::replace
(每个分支一个)。此外,一旦字符串超过短字符串优化缓冲区大小,性能效果也会有所不同。@rustyx-I可能强调得不好。我的意思是“几乎”更引人注目。我想有两个分支,因为这是分支预测失误时需要刷新的指令量。@rustyx-考虑到只有一个分支会被执行,不管是不是很快,我不认为分支需要更多关于效率的脚注,如果有的话。
#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;
}
bool flag = foo();
string str { flag ? "bcd" : "abc" };