C++ if语句速度

问题描述:

C++中有什么更快?C++ if语句速度

bool b1;

  1. if(b1 == true)if(b1)

  2. if(b1 == false) or if(!b1)

+5

你的基准测试结果是什么意思?大会说什么?这很容易通过编译,测试和查看反汇编来验证 – MatthiasB 2014-09-25 11:54:11

+1

由于变量未初始化,两者都有未定义的行为。但是任何编译器都应该在这两种情况下生成相同的代码 – 2014-09-25 11:54:48

+3

这几乎是无用的微优化。 – 2014-09-25 11:54:52

虽然真正的答案是依赖于编译器,我会说,卡萨斯的9​​9%是相同的。在这两种情况下。

C++11语言规范是一个文档(查看最新草案n3337),英文不谈论速度(至少基本语句)。

你不应该担心在所有:任何好的C++编译器会optimize(至少当被问到,例如用于GCCg++ -Og++ -O2等),可能给在同一台机器代码(或至少,类似的代码性能)。

顺便说一句,如何编译和优化很大程度上取决于目标处理器和if的主体(例如因为branch prediction)。有时,编译器会发现使用条件移动可能比条件跳转更快。

随着GCC,有很少箱子在那里你可以帮助使用__builtin_expect编译器,但你应该总是不打扰(而且经常坏或过量使用该__builtin_expect会计算减慢)。您可能会考虑同样适当并非常小心地使用__builtin_prefetch(请参阅this),但同样,您通常不应该在意。

请记住,premature optimization is evil(几乎总是)。

+1

Stroustrup的书中经常提到性能,如果不是标准的话;它显然推动了一些语言决策。 – 2014-09-25 12:06:38

+0

但是标准不会回答OP所问的问题。 – 2014-09-25 12:07:11

+1

当然可以;我甚至不想出现因为你的答案是现货而争辩;不过这是一个合理的问题;标准文档本身既不像其他许多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本身重载==,所以你的陈述是等价的 - 并且几乎肯定会执行相同的操作。