2014-09-25 114 views
-5

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

回答

2

雖然真正的答案是依賴於編譯器,我會說,卡薩斯的9​​9%是相同的。在這兩種情況下。

3

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

3

比性能問題更有趣的是,當您處理類時(而不是簡單舊數據(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本身重載==,所以你的陳述是等價的 - 並且幾乎肯定會執行相同的操作。