當完全禁用優化時編譯同一段代碼(g++ -O0
),然後再次啓用優化時(g++ -O3
),如何更改源代碼本身的邏輯?編譯器優化如何影響代碼邏輯?
例如,編譯器可以
這兩個優化使代碼執行更快,而不影響原始源代碼的完整性。沒有這些優化的任何代碼都會在啓用它們的情況下運行。
但是,編譯器優化也會影響代碼邏輯。這裏有兩個例子,我知道:
- Removing copy constructors and assignment operators來自臨時工可能會消除可能的副作用。
- 重新排列包含浮點值的算術可能會影響浮點錯誤(希望需要
-ffast-math
參數)。
我很驚訝和幸運,瞭解這些,因爲他們可能成爲錯誤情況下的巨大潛在問題。
所以我想知道,有沒有其他情況下,C++編譯器優化會影響代碼邏輯?我特別在g ++編譯器下尋找關於C++ 11的信息(沒有任何未定義的行爲),但是歡迎其他編譯器的提示。
不要忘記提及未定義的行爲將意味着什麼。 – Mysticial
我相信編譯器也可以'不計算'以後從不使用的東西。雖然這不會改變代碼的邏輯,但如果您要衡量性能,那可能會很糟糕。雖然我不確定。 – leo
@leo好點!雖然,我總是期望編譯優化會更快,因爲這是優化器的工作。 – Ryan