回答
雖然真正的答案是依賴於編譯器,我會說,卡薩斯的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
本身重載==
,所以你的陳述是等價的 - 並且幾乎肯定會執行相同的操作。
- 1. 快速減少if語句的長度
- 2. 速記IF語句
- 3. 速記if語句
- 4. 的jQuery/JavaScript的if語句速度
- 5. 快速礦工 - IF語句
- 6. 速記if語句PHP
- 7. 麻煩if if語句C++
- 8. C++ If/else if語句
- 9. C#short if語句
- 10. C#if語句dropdownlist.selectedvalue
- 11. if語句爲C++
- 12. C++:在IF語句
- 13. C++ if ... then語句
- 14. objective-c if語句
- 15. C#if語句範圍內的語句
- 16. ASH if if語句中的if語句
- 17. 速度更快 - if語句還是函數的調用?
- 18. 如果語句嵌套if if語句嵌套if語句,
- 19. C#錯誤if語句
- 20. 開關與if語句C#
- 21. 嵌套if語句C++
- 22. C++的if語句錯誤
- 23. 在線IF語句在C#
- 24. C#中的if/else語句
- 25. if語句的GetType()C#
- 26. C++「超載」的if()語句
- 27. C#中的if else語句
- 28. Arduino/C++ IF/ELSE語句
- 29. 精簡if語句C#
- 30. 多條件if語句C++
你的基準測試結果是什麼意思?大會說什麼?這很容易通過編譯,測試和查看反彙編來驗證 – MatthiasB 2014-09-25 11:54:11
由於變量未初始化,兩者都有未定義的行爲。但是任何編譯器都應該在這兩種情況下生成相同的代碼 – 2014-09-25 11:54:48
這幾乎是無用的微優化。 – 2014-09-25 11:54:52