代码对比:效率上用哪个代码比较好?
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
中有一个明显的分支,但是运行时执行的代码仍然总是会是一个 潜在 分配和字符串内容的副本。此处的分支预测错误可能会有 一些 成本,但除非它处于 really 紧密循环中,否则我认为不值得考虑。此外,在这样的循环中使用 std::string
本身可能被认为是有问题的。
C++方式是使用初始化:
bool flag = foo();
string str { flag ? "bcd" : "abc" };
flag
确定在调用 std::string::string(const char*)
时使用哪个字符串文字。但是有一个调用,一个正在构造的字符串对象,没有赋值。
[编辑]
翻转字符串文字。在 C++ 中,对于 if
构造和 ?:
构造,"true" 情况首先出现,然后 "false" 情况最后出现。但是问题把它们颠倒了,"abc" 在 flag==false
案例中排在第一位。
哪个代码更适合用于初始化字符串?
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
中有一个明显的分支,但是运行时执行的代码仍然总是会是一个 潜在 分配和字符串内容的副本。此处的分支预测错误可能会有 一些 成本,但除非它处于 really 紧密循环中,否则我认为不值得考虑。此外,在这样的循环中使用 std::string
本身可能被认为是有问题的。
C++方式是使用初始化:
bool flag = foo();
string str { flag ? "bcd" : "abc" };
flag
确定在调用 std::string::string(const char*)
时使用哪个字符串文字。但是有一个调用,一个正在构造的字符串对象,没有赋值。
[编辑]
翻转字符串文字。在 C++ 中,对于 if
构造和 ?:
构造,"true" 情况首先出现,然后 "false" 情况最后出现。但是问题把它们颠倒了,"abc" 在 flag==false
案例中排在第一位。