回答
調試未優化的程序要容易得多,因爲目標代碼往往是源代碼的更直接翻譯。啓用優化後,編譯器可能會重新排列語句,或者通過將多個操作合併爲一個操作來完全排除它們。這意味着在調試程序(或核心轉儲)時,不存在從程序映像中的位置到源代碼行的直接映射。
GCC 4.8增加了一個新的優化級是性能和可調試性之間有很大的妥協:
一個新的通用優化級別,
-Og
,已經出臺。它解決了快速編譯和出色調試體驗的需求,同時提供了合理的運行時性能水平。整體開發經驗應優於默認優化級別-O0
。
隨着-Og
的編譯器優化技術簡單不使其更難調試,不要花太長時間來編譯,所以代碼執行不是完全未優化的代碼更好,但仍然可以調試。
這使得調試更加準確無需優化。
未使用的變量,冗餘語句不會被跳過。
其中一個原因是,如果您想用調試程序遍歷代碼。如果啓用優化,語句可以重新排序或者遺漏,並且程序的執行將不必一步一步地遵循源代碼中的內容。變量的值可能不可用,因爲它們已被優化。因此,在調試器中運行它時很難推斷程序在做什麼。
避免優化的另一個原因是您在程序中使用了未定義的行爲,優化可能導致程序中斷。 (實際上,這是使用優化的原因 - 查找此類錯誤。)
在一個較老的項目上,我們所有的測試都是在調試版本中完成的,包括大量的打印語句。對於交付給客戶的最終版本,決定不使用經過較少測試的零售版本(使用gcc的全面優化選項),因爲這可能引入與時間相關的問題(實際上,缺陷的發現現在由於特定調試版本的時間安排),並且由於客戶對目前的操作速度感到滿意。
在我目前的項目中,很多代碼都放在ROM中(最初是全部),然後我們顯然不想刪除死代碼,因爲將來的更新將被放置在RAM中 - 然後仍然使用ROM代碼,減少RAM中的空間需求。
另外,什麼是默認值?優化空間或執行時間?不選擇是唯一正確的選擇。
- 1. 如何在不進行任何優化的情況下編譯C程序
- 2. 是否可以在沒有lib的情況下編譯C++?
- 3. 如何在沒有運行SBT的情況下編譯測試
- 4. 在沒有轉譯的情況下在SCSS中進行註釋
- 5. 如何在沒有System.Web dll的情況下進行UrlDecode編程#
- 6. MapActivity有時會在沒有任何理由的情況下關閉
- 7. 在沒有strtok的情況下在C中進行令牌化()
- 8. 如何在沒有優化的情況下使用gcc與gcc?
- 9. 在多線程的情況下,某些編譯器優化是否無效?
- 10. 如何在沒有任何動態庫的情況下編譯swift?
- 11. 是否有可能在不進入REPL的情況下編譯clojure源代碼?
- 12. 如何在沒有dll的情況下編譯GNU sed?
- 13. 如何在沒有avx的情況下爲kvm centos編譯dpdk
- 14. 如何在沒有Eclipse的情況下編譯greenDao示例?
- 15. 如何在沒有DynamicInvoke的情況下編譯MethodCallExpression?
- 16. 如何在沒有visual studio的情況下編譯C文件
- 17. 如何在沒有QtCreator的情況下編譯Qt 5項目?
- 18. MyEclipse如何在沒有javac的情況下編譯Java類?
- 19. 如何在沒有證書的情況下編譯設備?
- 20. 如何在沒有Shade插件的情況下編譯DropWizard?
- 21. 編譯器是否會在沒有主體的情況下內聯函數?
- 22. 如何在有理性的情況下編寫條件任務
- 23. C++程序在沒有任何理由的情況下隨機停止
- 24. 是否有任何情況下finally塊不會被執行?
- 25. 在沒有fenv.h的情況下在cygwin中編譯redisql
- 26. 是否可以在沒有X-server的情況下運行JavaFx?
- 27. 是否可以在沒有Weblogic Server的情況下運行OSB?
- 28. 在沒有運行時庫的情況下在Linux下編譯C++
- 29. 在沒有編譯的情況下測試我的android庫
- 30. 在沒有重新編譯的情況下提升PostgreSQL的NAMEDATALEN