2012-04-04 70 views
2

編譯器治療如果我做這樣的事情如何進行循環檢查

for i = 0; i < len(arr); i++ { 
    ... 
} 

是對LEN()在每次迭代計算的?對於gcc是否有任何優化標誌可以設置來改變它。

+0

有成千上萬的編譯器,每一個方面都不同的方式處理這個。更加詳細一些! – asawyer 2012-04-04 17:14:39

回答

0

如果你不想LEN每次執行:

int length = len(arr); 

for i = 0; i < length; i++ { 
    ... 
} 
+0

這不是問題。 – delnan 2012-04-04 17:16:43

1

是,LEN()在每次迭代被調用。它是相同的,如果你使用一個簡單的變量來代替。

for(i=0 ; i< a; i++) 

雖然並不建議這樣做,你可以改變a中期運行的價值。

2

我相信語言定義(假設我們在這裏採用C/C++)要求每次都調用它。如其他答案中的建議,你必須自己做這個優化。編譯器通常不知道調用len()函數是否會產生副作用,或者在每次調用時都會返回相同的值,因此通常無法將其從循環中取出。既然你知道len()做什麼,你可以執行該優化。

+2

是否足以讓最終結果與每次被調用的結果相同。 – alvin 2012-04-04 17:31:07

1

如果它在每次迭代期間沒有改變。它被稱爲循環不變量。循環不變式可以(可以是單詞)在循環體上方懸掛。 但沒有必要這樣做的正確性。在函數調用的情況下,編譯器很難確定該值是否是循環不變的。如果它是內聯函數,那麼理論上可以確定循環不變性。但我不確定是否有任何特定的編譯器實際執行此操作。

看到loop invariant code motion以獲取更多信息