2
A
回答
14
從標準點的視圖,編譯器必須評估左手側,即foo()
必須被調用:
[C99,6.5.13]不同於按位二進制
&
運營商,&&
運營商保證從左到右的評估; 評估第一個操作數後有一個序列點。如果第一個操作數 的值等於0,則不計算第二個操作數。
但由於它知道if
語句的身體永遠不能達到,*那麼它是免費的,省略任何相應的代碼部分。
當然,如果編譯器可以證明foo()
沒有可觀察到的副作用,那麼它也可以自由優化該呼叫。但這與短路行爲無關。
*(C++ - 只)假設
foo()
不與operator&&
過載返回類型。
1
2
編譯器有確定0
意味着不執行在if
聲明之前執行foo
。但是,如果foo
是一個非常簡單的函數,它沒有副作用(不會改變任何全局狀態 - 並且在C和C++標準中有很長的定義),那麼它本身可以被優化。通常只有在foo
是相同源代碼的一部分時纔會發生。
相關問題
- 1. C++循環的編譯器優化
- 2. 編譯器是否允許進行這樣的優化?
- 3. 允許C編譯器優化掉冗餘語句嗎?
- 4. 編譯器優化
- 5. 編譯器優化
- 6. 優化x64彙編器MUL循環
- 7. 編譯器可以優化嵌套循環嗎?
- 8. 循環自變量的編譯器優化
- 9. 循環優化/ CoreData優化
- 10. 循環優化
- 11. 優化循環
- 12. 循環優化
- 13. GNU編譯器優化
- 14. C++編譯器優化
- 15. 編譯器優化實現
- 16. PHP編譯器優化
- 17. 編譯器謂語優化
- 18. 優化css編譯器
- 19. Requirejs優化器不編譯
- 20. 克++編譯器的優化
- 21. Java編譯器優化
- 22. 編譯器優化問題
- 23. 二郎編譯器優化
- 24. const rvalue引用是否允許對編譯器進行額外優化?
- 25. 編譯許多嵌套循環:: cppFunction
- 26. 編譯器跳過循環
- 27. 編譯器循環引用
- 28. Closure編譯器for循環
- 29. 此編譯器轉換是否允許?
- 30. Flash編譯器不允許覆蓋
編譯器被允許執行任何能夠產生C標準定義的正確結果的東西...所以foo()是否可以優化取決於它的功能,當然它可以優化if塊因爲它永遠不會被執行。 –