2013-10-07 76 views

回答

3

調試未優化的程序要容易得多,因爲目標代碼往往是源代碼的更直接翻譯。啓用優化後,編譯器可能會重新排列語句,或者通過將多個操作合併爲一個操作來完全排除它們。這意味着在調試程序(或核心轉儲)時,不存在從程序映像中的位置到源代碼行的直接映射。

GCC 4.8增加了一個新的優化級是性能和可調試性之間有很大的妥協:

一個新的通用優化級別,-Og,已經出臺。它解決了快速編譯和出色調試體驗的需求,同時提供了合理的運行時性能水平。整體開發經驗應優於默認優化級別-O0

隨着-Og的編譯器優化技術簡單不使其更難調試,不要花太長時間來編譯,所以代碼執行不是完全未優化的代碼更好,但仍然可以調試。

1

這使得調試更加準確無需優化。

未使用的變量,冗餘語句不會被跳過。

3

其中一個原因是,如果您想用調試程序遍歷代碼。如果啓用優化,語句可以重新排序或者遺漏,並且程序的執行將不必一步一步地遵循源代碼中的內容。變量的值可能不可用,因爲它們已被優化。因此,在調試器中運行它時很難推斷程序在做什麼。

避免優化的另一個原因是您在程序中使用了未定義的行爲,優化可能導致程序中斷。 (實際上,這是使用優化的原因 - 查找此類錯誤。)

1

在一個較老的項目上,我們所有的測試都是在調試版本中完成的,包括大量的打印語句。對於交付給客戶的最終版本,決定不使用經過較少測試的零售版本(使用gcc的全面優化選項),因爲這可能引入與時間相關的問題(實際上,缺陷的發現現在由於特定調試版本的時間安排),並且由於客戶對目前的操作速度感到滿意。

在我目前的項目中,很多代碼都放在ROM中(最初是全部),然後我們顯然不想刪除死代碼,因爲將來的更新將被放置在RAM中 - 然後仍然使用ROM代碼,減少RAM中的空間需求。

另外,什麼是默認值?優化空間或執行時間?不選擇是唯一正確的選擇。

相關問題