2012-09-20 30 views
0

編譯:VISUAL C++ 2012 RTM這是一個有效的編譯器優化?

錯誤或不?:https://connect.microsoft.com/VisualStudio/feedback/details/763601/visual-c-2012-rtm-serious-compiler-bug

對我來說,似乎不可思議,將內聯調用測試()進入第二的std ::法院聲明。

+4

你應該在這裏發佈實際的問題,而不是僅僅鏈接到問題,因爲鏈接死亡。 –

+0

這個錯誤報告對我來說似乎不一致。你怎麼知道什麼時候調用了'test'? –

+0

@DavidSchwartz:test()需要一段時間才能完成,所以我可以告訴它何時被調用。 – NFRCR

回答

8

是的。編譯器可以自由地進行程序無法檢測到的更改。由於test函數沒有外部可見的效果,因此編譯器可以根據自己的意願自由地提前或延遲,甚至完全消除它。

如果你可以解釋一下這種優化方式,使你的代碼做了一些它不應該做的事情,那麼你有什麼東西。但到目前爲止,您唯一的說法是它使您的代碼運行得更慢或更快。編譯器可以自由進行優化,使代碼的某些部分更慢,並且部分部分更快。事實上,這就是優化的本質 - 進行性能折衷,我們希望能產生淨收益。這可能會導致生成的代碼質量不佳,儘管在這種情況下似乎不是,但它肯定是有效的。這就是優化的全部內容。

編譯器將獲取您的源代碼並生成輸出編譯代碼。只要它產生源代碼要求它產生的可觀察結果,就可以自由構建任何它喜歡的編譯代碼。如果它可以找到一種方式來產生相同的效果,它就不需要像源代碼那樣產生輸出。這是整個優化的重點 - 不要從字面上理解你要求它做什麼,而是要產生與其他一些結果相同的結果,希望更好。

3

它歸結爲如果如果規則。只要編譯器的外部行爲與變換之前的行爲不可區分,編譯器就可以自由地轉換程序。

該規則的更精確的表述可以在here找到。請注意,此定義中包含對揮發性物質的訪問,因此您在更改波動率時會看到差異。