簡體   English   中英

gcc -O2 的含義

[英]Meaning of gcc -O2

我在 makefile 中經常看到這個標志。 它是什么意思,應該在什么時候使用?

優化級別 2。

從 GCC 手冊頁:

-O1 優化。 優化編譯需要更多時間,對於大型 function,需要更多的 memory。

-O2 優化更多。 GCC 執行幾乎所有不涉及空間速度折衷的支持優化。 當您指定 -O2 時,編譯器不會執行循環展開或 function 內聯。 與 -O 相比,此選項增加了編譯時間和生成代碼的性能。

-O3 優化更多。 -O3 打開 -O2 指定的所有優化,同時打開 -finline-functions、-funswitch-loops、-fpredictive-commoning、-fgcse-after-reload 和 -ftree-vectorize 選項。

-O0 減少編譯時間並使調試產生預期的結果。 這是默認設置。

-Os 優化大小。 -Os 啟用通常不會增加代碼大小的所有 -O2 優化。 它還執行旨在減少代碼大小的進一步優化。

優化級別 2,最大值為 3。參見: http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

請注意,在幾年前, -O3可能會通過過度“優化”代碼而導致一些故障。 AFAIK,現代版本的 GCC 不再適用。 但由於慣性, -O2被認為是“最安全的”。

這是一個優化開關。 請參閱 gcc --help。

編譯器可以使用各種優化技術,如循環展開、CPU 管道優化來查找無用代碼並避免數據危害來加速您的代碼。 例如,發生固定次數的循環將被轉換為連續代碼,而沒有循環控制開銷。 或者,如果所有循環迭代都是獨立的,則可以進行一些代碼並行化。

將優化級別設置為 2 表明編譯器應該花費多少精力來尋找這些優化。 可能的值范圍從 1 到 3

您可以了解更多關於編譯器可以做什么來優化您的代碼: http://en.wikipedia.org/wiki/Compiler_optimization

嘗試過手冊頁?

-O2

進一步優化。 GCC 執行幾乎所有不涉及空間速度折衷的支持優化。 當您指定 -O2 時,編譯器不會執行循環展開或 function 內聯。 與 -O 相比,此選項增加了編譯時間和生成代碼的性能。

用人類的話來說:這是最高的真正安全的優化方式。 -O3 進行重組,這有時會很麻煩。 這樣的主題是相當深刻的。

在沒有任何優化選項的情況下,編譯器的目標是降低編譯成本並使調試產生預期的結果。 打開優化會使編譯器嘗試以犧牲編譯時間和調試程序的能力為代價來提高性能和/或代碼大小。

默認為關閉優化。 這會產生最快的編譯時間,但編譯器絕對不會嘗試優化,並且生成的程序比啟用優化時要大得多且慢得多。 在 gcc 中有各種 -O 開關(允許的 forms 是 -O0、-O1 -O2、-O3 和 -Os)來控制優化級別:

-O0 無優化; 生成未優化的代碼,但編譯時間最快。 這是默認設置。

-O1 中等優化; 優化得相當好,但不會顯着降低編譯時間。 大型 function 需要更多的 memory。

-O2 GCC 執行幾乎所有不涉及空間速度折衷的支持優化。 當您指定時,編譯器不會執行循環展開或 function 內聯

-O3 與 -O2 一樣的完全優化; 還使用更積極的單元內子程序的自動內聯並嘗試向量化循環。 它還打開 -finline-functions、-funswitch-loops、-fpredictive-commoning、-fgcse-after-reload 和 -ftree-vectorize 選項。

-Os 優化大小。 -Os 啟用通常不會增加代碼大小的所有 -O2 優化。 它還執行旨在減少代碼大小的進一步優化。

要了解有關在各種優化級別使用的標志/選項及其詳細信息的更多信息: http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

暫無
暫無

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

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