簡體   English   中英

在GCC中使用-O3有什么缺點嗎?

[英]Are there any drawbacks to using -O3 in GCC?

我已經在各種語言中擔任了13年的軟件工程師,盡管我現在正在進入C和后來的C ++。 當我正在學習C時,我正在使用GCC編譯器來編譯我的程序,我想知道是否有使用-O3或其他優化標志的問題。 如果沒有測試編譯的代碼,或者在交叉編譯期間,我的軟件可能會破壞我無法捕獲的方式,我可能會無意中混淆了某個不同的平台。

在我盲目地打開這些選項之前,我想知道我能期待什么。 此外,由於-Ofast打開了不符合標准的標志,我傾向於不使用它。 在我的假設中,我是否正確--Ofast很可能會產生“副作用?”

在發布此問題之前,我已經瀏覽了https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

-O3的唯一缺點應該是無法在調試器中遵循代碼。

使用-Ofast會影響一些浮點運算導致舍入錯誤,但除非您運行特定的長鏈浮點計算,否則您不太可能注意到。

破壞的代碼(帶有錯誤指針的代碼或具有未定義行為的語句)可能在不同的優化級別上表現不同 - 許多程序員的第一反應是責怪編譯器 - 啟用所有警告並修復它們通常會有所幫助。

重要的是要記住幾乎所有編譯器優化都是啟發式的 換句話說,“optmization”只是試圖使你的程序更“理想”,但它可能會產生相反的效果。 僅僅因為-O3應該優於-O2 ,並且-O2應該優於-O1 - 這並不意味着實際上它總是如何工作。

有時,與使用-O2-O1生成的版本相比, -O3啟用的“優化”實際上可能會降低程序速度。 您應該嘗試不同級別的優化,以查看哪種方法最適合您的特定代碼。 如果您真的想要對其進行微調,您甚至可以打開和關閉各個選項。

所以簡而言之,使用-O3可能會有缺點。 我個人觀察到我寫的很多東西在使用-O2比使用-O3更好 - 但這確實是程序特定的。


僅供參考,這是另一個SO問題,它詢問為什么-O2為特定程序提供比-O3更好的結果: gcc優化標志-O3使代碼慢於-O2

由於-O3開始移動代碼以優化它,在某些情況下,您可能會看到結果不同或中斷。

如果使用-O3測試代碼的正確性並找到無法調試的問題,建議切換到-O0以查看是否獲得相同的行為。

“我想知道我能期待什么”

我在嵌入式系統中使用C ++(主要是vxWorks上的GCC)超過20年。 我非常尊重編譯器編寫者。


相信你的編譯器:恕我直言,-O3從來沒有破壞任何代碼......但有時會發現有趣的編碼錯誤。


選擇:參賽隊必須選擇是否要“寄給你考什么,並測試你的船是什么”,無論-O1或-O3選擇。 我與之合作的團隊一直致力於使用-O3進行發貨和測試。


單步可以是不合作的:在個人實踐層面,當使用-O3代碼時,我通常會“放棄”gdb單步。 我更多地使用了斷點,並且編碼選擇略有不同,使自動變量(堆棧數據)和類數據更“可見”。 (你可以使gdb命令'p'成為你不方便的朋友)。


單步是必要的:請注意,即使我們使用-O3“測試並運送”,我們幾乎只使用-O1代碼進行調試。


調試是必要的:調試-01之間的權衡,但測試和運輸-O3是切換兩個可執行文件所需的額外重新編譯。 在-O1中保存以探索,識別和修復代碼錯誤的時間必須構成2次重建(到-01並返回到-O3)。


回歸測試自動化:我想說-O3的系統測試(也稱為集成測試或回歸測試)必須提升一個檔次,但我無法真正描述它......或許我應該推薦測試自動化水平更高(每一個REGRESSION TESTs!)。 但我不確定。 回歸測試的自動化級別可能更多地與團隊規模相關,而不是與績效水平相關。


“成功”的嵌入式系統可以做兩件事。 它滿足要求。 並且,我認為更重要的是,在所有人類可見的行為中,它就像一個輕載的桌面。 對於任何動作(按鈕按壓,電纜斷開,測試設備引起的誤差,或甚至低狀態的燈光變化),結果都沒有人類可察覺的延遲。 -O3有幫助。 一個成功的系統可以完成......我已經看過了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM