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

Code Comparison : Which code is better to use in terms of efficiency?

本文关键字:代码 更好 比较 效率      更新时间:2023-10-16

哪个代码更好用:初始化字符串?

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

string str;
if(flag)
str = "bcd";
else
str = "abc";

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;
}

..Clang 8.0 将为这三种情况(尤其是foo1foo3)产生几乎等效的组装1。你可以在Godbolt上看到它。

这并不奇怪,因为您的三个代码段指示的可观察行为是相同的,并且不受您选择的代码段的影响。所以不要纠缠于微观优化。详述更大规模地描述最佳行为。


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

C++方法是使用初始化:

bool flag = foo();
string str { flag ? "bcd" : "abc" };

flag确定在调用std::string::string(const char*)时使用哪个字符串文本。但是有一个调用,一个字符串对象正在构造,没有赋值。

[编辑] 翻转字符串文字。在C++中,无论是对于if构造还是?:构造,"真"大小写都是第一位的,然后是"假"大小写。但问题让他们颠倒过来,"abc"在flag==false案件中排在第一位。