C++ if语句速度
虽然真正的答案是依赖于编译器,我会说,卡萨斯的99%是相同的。在这两种情况下。
的C++11语言规范是一个文档(查看最新草案n3337),英文不谈论速度(至少基本语句)。
你不应该担心在所有:任何好的C++编译器会optimize(至少当被问到,例如用于GCC与g++ -O
或g++ -O2
等),可能给在同一台机器代码(或至少,类似的代码性能)。
顺便说一句,如何编译和优化很大程度上取决于目标处理器和if
的主体(例如因为branch prediction)。有时,编译器会发现使用条件移动可能比条件跳转更快。
随着GCC,有很少箱子在那里你可以帮助使用__builtin_expect
编译器,但你应该总是不打扰(而且经常坏或过量使用该__builtin_expect
会计算减慢)。您可能会考虑同样适当并非常小心地使用__builtin_prefetch
(请参阅this),但同样,您通常不应该在意。
请记住,premature optimization is evil(几乎总是)。
Stroustrup的书中经常提到性能,如果不是标准的话;它显然推动了一些语言决策。 – 2014-09-25 12:06:38
但是标准不会回答OP所问的问题。 – 2014-09-25 12:07:11
当然可以;我甚至不想出现因为你的答案是现货而争辩;不过这是一个合理的问题;标准文档本身既不像其他许多C++书籍一样便宜也不可读。 – 2014-09-25 12:10:51
比性能问题更有趣的是,当您处理类时(而不是简单旧数据(POD)bool
)它们并不意味着同样的东西。有人可能会调用==
的重载,而另一个则进行布尔转换。
考虑一下:
#include <iostream>
using namespace std;
class Something {
public:
operator bool() const {
cout << "Running implicit cast to bool\n";
return true;
}
};
bool operator==(Something const & left, bool const & right)
{
cout << "Running overloading of ==\n";
return false;
}
int main() {
Something s1;
if (s1 == true) {
cout << "(s1 == true) branch ran.\n";
}
if (s1) {
cout << "(s1) branch ran.\n";
}
return 0;
}
该程序的输出将是:
Running overloading of ==
Running implicit cast to bool
(s1) branch ran.
这是要注意的一个细微之处。虽然你不能为bool
本身重载==
,所以你的陈述是等价的 - 并且几乎肯定会执行相同的操作。
你的基准测试结果是什么意思?大会说什么?这很容易通过编译,测试和查看反汇编来验证 – MatthiasB 2014-09-25 11:54:11
由于变量未初始化,两者都有未定义的行为。但是任何编译器都应该在这两种情况下生成相同的代码 – 2014-09-25 11:54:48
这几乎是无用的微优化。 – 2014-09-25 11:54:52