代码比较:就效率而言,哪种代码更好用?
Code Comparison : Which code is better to use in terms of efficiency?
哪个代码更好用:初始化字符串?
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 将为这三种情况(尤其是foo1
和foo3
)产生几乎等效的组装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
案件中排在第一位。
相关文章:
- 有没有更好的方法来编写这个c++代码
- Boost tread 代码在 VC++ 下编译,但不在 GCC 下编译:如何获得更好的调试信息
- 设计许多单例代码结构的更好方法
- 如何在嵌入式平台中管理不同引脚输出板的代码,以实现更好的HAL管理
- 为什么 C++ 代码实现的性能不比 python 实现更好?
- 牢记干净的代码的性能,什么更好
- 代码比较:就效率而言,哪种代码更好用?
- 如何编写更好、更干净的银行帐户代码版本
- 哪一个更好?使用C 代码中的System()函数或使用源代码
- <thread> 在 C++/CLI 代码中包含的代码中使用。寻找更好的解决方案
- 有没有更好的方法可以使此代码线程安全?线程局部静态似乎是一个生硬的工具
- 更好地线程化代码以减少计算时间的方法
- 调用包含所有所需代码的函数或内部包含所需代码的其他函数的函数更好?
- 当我们不关心返回值时,在 c++ 的代码片段中只调用一次函数的更好方法?
- 现代 C/C++ 编译器能否更好地优化标头中的代码
- 是否有任何情况将对象标记为 const 会导致更好的优化代码(使用优化编译时)
- 哪一个性能更好:使用函数或精确代码
- 我是否应该将 const 用于局部变量以获得更好的代码优化
- 我怎么能迁移视频为Windows代码更好的东西
- 如何使这段代码更好?(C++温度转换器)