亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

停用GCC中的所有優化選項

停用GCC中的所有優化選項

侃侃無極 2019-10-21 15:43:50
使用GCC編譯C程序的默認優化級別是-O0。這會根據GCC文檔關閉所有優化。例如:    gcc -O0 test.c 但是,要檢查-O0是否真的關閉了所有優化。我執行了以下命令:    gcc -Q -O0 --help=optimizers 在這里,我有點驚訝。我啟用了大約50個選項。然后,我使用以下命令檢查了傳遞給gcc的默認參數:    gcc -v 我懂了:Using built-in specs.COLLECT_GCC=gccCOLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapperTarget: x86_64-linux-gnuConfigured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.4-       2ubuntu1~14.04' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --      enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnuThread model: posixgcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04) 所以我的結論是,-O0我提供給程序的標志沒有被其他東西覆蓋。實際上,我正在尋求從頭開始實現一種工具,該工具可以生成優化選項的隨機序列,并將生成的序列與默認級別0-3進行比較。就像“ acovea”一樣。因此,我想將生成的序列與零優化級別(應該是-O0)進行比較您能解釋一下為什么默認情況下啟用了50個選項-O0嗎?我想到的一個想法是使用50次編譯-O0并關閉默認優化。你怎么看?-O0-fno-OPTIMIZATION_NAME
查看完整描述

3 回答

?
精慕HU

TA貢獻1845條經驗 獲得超8個贊

Stricto sensu,GCC編譯器的中端由優化遍歷的序列(實際上是嵌套樹,在編譯過程中會動態更改)組成,因此,如果GCC沒有進行優化,則將無法發出任何代碼。


想想另一種方式:輸入語言GCC是相當豐富的(即使是純C,在那里你有while,for,...),但中間GIMPLE語言是更差(特別是GIMPLE / SSA),所以你需要到應用一些轉換以將源AST轉換為Gimple。這些轉換是優化過程,幾乎可以定義為。


另請參閱該答案和該答案的圖片(SVG圖片),并閱讀此處提到的參考資料。


您應該理解-O0為禁用生成某些可執行文件不需要的任何其他優化(例如,-O1etc等提供的優化)。


查看完整回答
反對 回復 2019-10-21
?
海綿寶寶撒

TA貢獻1809條經驗 獲得超8個贊

為了回答我的問題,我做出了一些結論和假設:


因此,我想說用O0進行編譯并不意味著不會應用任何優化。如上面@abligh所述,可以減少編譯時間并改善調試效果的選項將打開。


換句話說,O0在編譯級別上正在優化。生成的二進制文件未經過優化,以簡化調試過程。


我舉一個例子:該選項在O0級別啟用


漸進式循環優化


在GCC文檔中:


此選項告訴循環優化器使用語言約束來得出循環迭代次數的界限。這假定循環代碼不會通過例如引起有符號整數溢出或超出范圍的數組訪問來調用未定義的行為。循環迭代次數的界限用于指導循環展開和剝離以及循環退出測試優化。默認情況下啟用此選項。


因此,對于GCC 4.8.x,默認情況下將啟用近50個選項。


查看完整回答
反對 回復 2019-10-21
  • 3 回答
  • 0 關注
  • 1400 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號