2009-07-08 16 views
0

至於這個例子從代碼完成:如果 - 否則VS如果返回重新審視(未詢問多個返回OK與否)

Comparison Compare(int value1, int value2) 
{ 
if (value1 < value2) 
return Comparison_LessThan; 
else if (value1 > value2) 
return Comparison_GreaterThan; 
else 
return Comparison_Equal; 
} 

你也可以這樣寫:

Comparison Compare(int value1, int value2) 
{ 
if (value1 < value2) 
    return Comparison_LessThan; 

if (value1 > value2) 
    return Comparison_GreaterThan; 

return Comparison_Equal; 
} 

哪一個更優化? (可讀性等除外)

+0

我同意給出的答案,但是,對於選項2,您還可以添加if(value1 == value2),以便完全理解您的意圖。 – TahoeWolverine 2009-07-23 14:07:06

回答

17

可讀性一旁,編譯器應該足夠聰明來產生用於這兩種情況下相同的代碼。

1

它會真的取決於你的編譯器推斷你正在嘗試做什麼,並放置「跳」或不。這是微不足道的。

1

如果有返回語句,則沒有區別。

在這些情況下使用else可能會阻止您檢查第二個條件,以防輸入第一個if。但是性能差異應該非常緩慢,除非您有一個需要很長時間才能檢查的情況。

6

「可讀性等一邊」我期望編譯器從它們每個產生相同的代碼。

雖然如果你喜歡,你可以測試一下:你的C++編譯器可能有一個生成列表文件的選項,所以你可以看到每個版本生成的程序集/操作碼......或者你可以看到程序集/通過使用您的調試器檢查代碼(在啓動可執行文件後)操作碼。

5

這將在幾乎任何編譯器中生成相同的代碼...(GCC,visual studio等)。編譯器的工作原理與我們的邏輯稍有不同。如果成了,那麼......意味着在這兩種情況下,它只會落在最後一個回報聲明上。

編輯: 更一般地說,else語句就在那裏爲人類,它實際上不會在大多數編譯器上生成任何東西......這是真實的在你的情況和任何其他使用if ...其他...構造。

0

這兩個代碼示例應該在現代編譯器上進行相同的編譯,無論優化是打開還是關閉。如果您使用的舊編譯器不能識別它將編寫低效的代碼(很可能是未使用的代碼),那麼您唯一可能遇到的不同之處就是它可能遇到不同的問題。

如果您擔心優化,您可以考慮查看正在使用的算法。

+0

關注實際:優化和可讀性。我的算法有幾個微不足道的情況(不一定是相互關聯的)。所以,工作的主要部分是: 如果(a && b)返回false;如果(c && d)返回true,則返回 ; ... bool result = false; ... .. 返回結果; 沒有清理工作,對我個人而言,第二種形式更具可讀性,因爲它不涉及其他塊中的主塊。擔心這是否會對性能產生影響(如果{}未將其放在括號內) – psquare 2009-07-08 16:57:14

2

編譯器生成相同的代碼。編譯器最基本的一件事就是構建一個控制圖。基本上,「站在節點X處,我可以到達哪些節點」,然後爲這些可到達的節點插入跳轉語句。

而在你的情況下,控制圖是,正好是在這兩種情況下都是一樣的。

(當然,這是一個粗略的簡化,實際上產生任何實際的代碼之前編譯器做更多)

2

可讀性是正確的答案。任何編譯器都會在一個或兩個週期內生成等效的代碼,優化器也不會解析和排序控制流。

這就是爲什麼可讀性更重要。這段代碼的代價不僅僅是編寫它並編譯它。它可能必須由您或其他人在將來維護。你希望你的代碼是可讀的,以便下一個維護者不必浪費大量的時間去理解它。

<內衣面料=「石棉」>不是所有的編碼風格決定都應該單獨在「效率」或週期數上作出。 < /內衣>你應該寫低效率的代碼嗎?當然不是。但是,讓優化器在可能的時候處理這​​些小問題。你比這更有價值。

0

只要執行gcc -S來查看生成的彙編代碼,它應該是相同的。無論如何,你可以通過執行每1000000次和測量執行時間來回答自己。

相關問題