2010-02-08 143 views
1

哪個更有效哪種效率更高? if語句

if(!var_name) 

if(var_name == NULL) 
+0

var_name是一個指針 – Pardeep 2010-02-08 10:13:53

+1

這有什麼不同? – 2010-02-08 10:14:57

+10

當您運行基準測試時,您觀察到了什麼? – 2010-02-08 10:16:06

回答

16

兩者都會編譯成相同的代碼。您選擇使用哪一個應取決於哪一個最具可讀性。

這個版本:

if(var_name == NULL) 

應該只有當var_name指針使用,否則你會迷惑人誰在未來的讀取你的代碼。如果你在非指針上使用它,一些編譯器可能會抱怨。

這一個:

if(!var_name) 

應該在的情況下使用,當你在邏輯上治療var_name作爲布爾(真/假)值。這可以包括當var_name是指針時,因爲NULL是「false」或未定義指針的值。因爲我覺得它表達的意圖更加清晰

if(var_name == 0) 

如果var_name是一個整數,那麼我會選擇第三個選項。

+1

實際上,它們可能會編譯到不同的彙編語言指令,取決於處理器。有些處理器可能有*如果不等於*跳轉*(*如果不是零跳轉*)有些可能不是。無論哪種情況,與需求或設計優化相比,這都是一項簡單的優化。這個級別的優化是平臺特定的。 – 2010-02-08 19:32:36

+0

據說平等和不平等的經營者通常同樣更快:) – user347594 2010-05-27 17:13:09

7

沒關係。無論使用什麼編譯器,兩者都會非常高效,而且大多數編譯器都會編譯成完全相同的代碼。如果這是您真正關心的問題,請查看您的特定編譯器發出的彙編/機器代碼。

+1

我懷疑任何潛在的差異將永遠是顯着的。 – 2010-02-08 10:13:32

+0

@Brian Rasmussen:它可以很大程度上依賴於comppiler和要求。真的,如果有人在乎這麼多,他應該考慮拆解。 – sharptooth 2010-02-08 10:16:04

5

沒關係。

更改這將是micro optimisation並不太可能改變你的應用程序的性能(除非你已經檢查過這是瓶頸)。 除此之外,我敢打賭,編譯器會將此語句更改爲最佳語句(如果重要),所以我會使用您喜歡的語法。

-1

我不會使用編譯器爲性能敏感的東西生成不同的代碼。

0

如果var_name是一個指針,並且你正在爲一些嵌入式系統編譯一個蹩腳的非優化編譯器,var_name == NULL會更快,因爲一個強制轉換爲布爾值後接負號,然後跟真值比較會比普通價值比較。在大約每個其他編譯器的情況下,它們將被優化到相同的代碼。

+0

顯然,一個蹩腳的非優化編譯器可以讓它喜歡任何代碼,但n1256的6.5.3.3/5表示「表達式!E等價於(0 == E)」。所以這不僅僅是疏忽,C編譯器實際上必須爲此而走出困境!運算符生成轉換爲布爾類型的代碼,然後將其與真正的比較,因爲這不是如何!運算符被定義。在C++中可能會有所不同,我不記得了。 – 2010-02-08 11:08:31

1

第一個。它縮短了7個字符。

+0

...沒有。就是不行。字符數!=可讀性或更好。讓我們看看,哪一個告訴我更多,'dlsym'或'GetProcAddress'? – 2010-09-21 03:24:58

+0

我的觀點是兩者之間的唯一區別是它們所採用的字符數量,並且與編譯器沒有什麼區別,就像空白區別不同......在「高效」的意義上使用劇本。我碰巧喜歡第一個更好,但這肯定是一個品味的問題。 – 2010-09-21 19:51:15

0

如果「變種」是一個UDT,那麼選擇哪一種使用將引導更多由這些運營商的類提供,而不是效率(我相信是最上面的答覆回答)

0

從效率的角度來看,兩者都是等價的,但後來更適合可讀性,這在編碼中也起着至關重要的作用。