中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. "); //-->

        博客專(zhuān)欄

        EEPW首頁(yè) > 博客 > GCC編譯優(yōu)化解析

        GCC編譯優(yōu)化解析

        發(fā)布人:電子禪石 時(shí)間:2023-02-24 來(lái)源:工程師 發(fā)布文章
        編譯優(yōu)化

        如果不指定優(yōu)化標(biāo)志,gcc會(huì)產(chǎn)生可調(diào)試的代碼

        啟用優(yōu)化后,gcc會(huì)改變程序的結(jié)構(gòu),讓代碼變小或者運(yùn)行得更快

        -O0

        不優(yōu)化

        -O, -O1

        在不影響編譯速度的情況下,盡量采取一些優(yōu)化算法降低代碼大小和加快代碼運(yùn)行的速度,并啟用以下優(yōu)化選項(xiàng):

        • fauto-inc-dec
          地址訪(fǎng)問(wèn)時(shí),合并地址訪(fǎng)問(wèn)指令和地址的遞增和遞減操作

        • fbranch-count-reg
          在計(jì)數(shù)寄存器中運(yùn)行遞減和分支指令
          而不是單獨(dú)運(yùn)行遞減指令,并與零比較,然后再根據(jù)結(jié)果進(jìn)行分支

        • combine-stack-adjustments
          跟蹤堆棧的push和pop,并嘗試找到合并它們的方法

        • fcompare-elim
          判斷計(jì)算結(jié)果的flag寄存器,如果可以,用flag寄存器的結(jié)果來(lái)代替現(xiàn)式地比較操作

        • fcprop-registers
          通過(guò)寄存器存有的值,通過(guò)計(jì)算變量的依賴(lài),減少?gòu)膬?nèi)存中讀取該變量的值,通過(guò)拷貝傳播,來(lái)減少變量的拷貝

        • -fdce
          消除死代碼

        • -fdefer-pop
          程序一般在函數(shù)返回時(shí),會(huì)pop出棧中元素
          而編譯器,會(huì)合并多個(gè)函數(shù)調(diào)用,并一次性pop出相關(guān)的元素

        • -fdelayed-branch
          嘗試對(duì)指令重新排序,來(lái)利用延遲分支指令后可用的指令槽

        • -fdse
          對(duì)死代碼進(jìn)行消除

        • -fforward-propagate
          The pass tries to combine two instructions and checks if the result can be simplified. If loop unrolling is active, two passes are performed and the second is scheduled after loop unrolling.

        • -fguess-branch-probability
          分支預(yù)測(cè)

        • -fif-conversion2
          利用條件執(zhí)行把if條件轉(zhuǎn)化為無(wú)分支等價(jià)代碼

        • -fif-conversion
          利用moves, min, max, set, abs等手段把if條件轉(zhuǎn)化為無(wú)分支等價(jià)代碼

        • -finline-functions-called-once
          把靜態(tài)函數(shù)轉(zhuǎn)為inline函數(shù)

        • -fipa-pure-const
          發(fā)現(xiàn)函數(shù)是純函數(shù)還是常量函數(shù)

        • -fipa-profile
          對(duì)cold(僅調(diào)用一次的函數(shù))函數(shù)進(jìn)行優(yōu)化

        • -fipa-reference

        • -fmerge-constants
          合并常數(shù)計(jì)算

        • -fmove-loop-invariants
          優(yōu)化循環(huán)的不變量

        • -freorder-blocks
          重排代碼塊

        • -fshrink-wrap
          函數(shù)的開(kāi)場(chǎng)白僅在使用前才初始化,而不是在函數(shù)開(kāi)始的時(shí)候做

        • -fshrink-wrap-separate
          把函數(shù)的開(kāi)場(chǎng)白和結(jié)束語(yǔ)分開(kāi),盡在使用的時(shí)候才初始化

        • -fsplit-wide-types
          對(duì)于某些需要占用多個(gè)寄存器的變量,獨(dú)立的申請(qǐng)寄存器

        • -fssa-backprop
          在定義鏈上傳播相關(guān)使用的信息,來(lái)簡(jiǎn)化定義

        • -fssa-phiopt
          優(yōu)化條件代碼

        • -fstore-merging
          合并存儲(chǔ)

        • -ftree-bit-ccp
          在tree上傳播稀疏條件位常量,并對(duì)齊傳播指針

        • -ftree-ccp
          在tree上傳播稀疏條件常量,并對(duì)齊傳播指針

        • -ftree-ch

        • -ftree-coalesce-vars

        • -ftree-copy-prop

        • -ftree-dce

        • -ftree-dominator-opts

        • -ftree-dse

        • -ftree-forwprop

        • -ftree-fre

        • -ftree-phiprop

        • -ftree-sink

        • -ftree-slsr

        • -ftree-sra

        • -ftree-pta

        • -ftree-ter

        • -funit-at-a-time

        -O2

        會(huì)犧牲一定的編譯速度,除了執(zhí)行O1的所有編譯優(yōu)化之外,還會(huì)采取幾乎所有的目標(biāo)配置支持的優(yōu)化算法,用來(lái)提高目標(biāo)代碼的運(yùn)行速度

        • -fthread-jumps
          判斷是否有double jump,并進(jìn)行優(yōu)化

        • -falign-functions
          把函數(shù)的開(kāi)始地址對(duì)齊到2的冪

        • -falign-jumps
          把分支的起點(diǎn)地址對(duì)齊到2的冪

        • -falign-loops
          把循環(huán)的開(kāi)始地址對(duì)齊到2的冪

        • -falign-labels
          把標(biāo)簽的地址對(duì)齊到2的冪

        • -fcaller-saves

        • -fcrossjumping

        • -fcse-follow-jumps

        • -fcse-skip-blocks

        • -fdelete-null-pointer-checks
          檢查是否存在delete空指針

        • -fdevirtualize -fdevirtualize-speculatively
          用子類(lèi)虛函數(shù)覆蓋虛函數(shù)函數(shù)指針

        • -fexpensive-optimizations

        • -fgcse -fgcse-lm
          全局的公用子表達(dá)式優(yōu)化

        • -fhoist-adjacent-loads

        • -finline-small-functions
          把小函數(shù)優(yōu)化為內(nèi)聯(lián)函數(shù)

        • -findirect-inlining

        • -fipa-cp
          過(guò)程間常數(shù)傳播

        • -fipa-cp-alignment

        • -fipa-bit-cp

        • -fipa-sra
          過(guò)程間優(yōu)化,刪除未使用的參數(shù),將值傳遞優(yōu)化為引用傳遞

        • -fipa-icf

        • -fisolate-erroneous-paths-dereference
          檢測(cè)由于取消空指針而觸發(fā)錯(cuò)誤或未定義行為的路徑,將這些路徑隔離

        • -flra-remat
          通過(guò)上下文敏感,重用變量

        • -foptimize-sibling-calls
          優(yōu)化同級(jí)和尾部遞歸調(diào)用

        • -foptimize-strlen
          優(yōu)化strlen函數(shù)

        • -fpartial-inlining
          部分內(nèi)聯(lián)函數(shù)

        • -fpeephole2
          機(jī)器相關(guān)優(yōu)化

        • -freorder-blocks-algorithm=stc
          塊內(nèi)代碼重排優(yōu)化

        • -freorder-blocks-and-partition -freorder-functions
          重排代碼

        • -frerun-cse-after-loop
          重新運(yùn)行公共表達(dá)式減少在循環(huán)后

        • -fsched-interblock -fsched-spec
          在不同塊間進(jìn)行重排指令

        • -fschedule-insns -fschedule-insns2

        • -fstrict-aliasing
          類(lèi)型嚴(yán)格轉(zhuǎn)換檢查

        • -fstrict-overflow
          檢查類(lèi)型是否溢出

        • -ftree-builtin-call-dce

        • -ftree-switch-conversion -ftree-tail-merge

        • -fcode-hoisting

        • -ftree-pre

        • -ftree-vrp

        • -fipa-ra
          函數(shù)調(diào)用者,如果某些寄存器沒(méi)有用到,則可以不需要保存這些寄存器的值

        -O3

        除了執(zhí)行O2所有的優(yōu)化選項(xiàng)之外,一般還會(huì)采用很多向量化算法,提高程序的并行度,并利用CPU的流水線(xiàn)和cache來(lái)加快運(yùn)行速度,

        這個(gè)選項(xiàng)會(huì)加大代碼的大小,并降低目標(biāo)代碼的執(zhí)行時(shí)間

        • -finline-functions
          采用一些啟發(fā)式算法對(duì)函數(shù)進(jìn)行內(nèi)聯(lián)

        • -funswitch-loops
          找到循環(huán)的不變條件,并移到循環(huán)外部

        • -fpredictive-commoning
          在循環(huán)間重用計(jì)算

        • -fgcse-after-reload
          執(zhí)行全局的共同子表達(dá)式消除

        • -ftree-loop-vectorize 
          向量化優(yōu)化

        • -ftree-loop-distribute-patterns
          把loop的某些部分轉(zhuǎn)化為標(biāo)準(zhǔn)函數(shù),例如memset

        • -fsplit-paths

        • -ftree-slp-vectorize
          基本塊向量化

        • -fvect-cost-model

        • -ftree-partial-pre
          部分冗余代碼消除

        • -fpeel-loops

        • -fipa-cp-clone
          過(guò)程間調(diào)用函數(shù)克隆,讓常量傳播更有效

        -Os

        目的是盡量減少目標(biāo)代碼的大小,這對(duì)存儲(chǔ)容量很小的設(shè)備尤為重要

        • -falign-functions
          對(duì)齊

        • -falign-jumps
          對(duì)齊

        • -falign-loops
          對(duì)齊

        • -falign-labels
          對(duì)齊

        • -freorder-blocks
          重排

        • -freorder-blocks-algorithm=stc
          重排

        • -freorder-blocks-and-partition
          重排

        • -fprefetch-loop-arrays
          預(yù)取

        -Ofast

        除了啟用所有O3的優(yōu)化選項(xiàng)之外,還會(huì)針對(duì)某些語(yǔ)言啟用部分優(yōu)化

        -Og

        目的是保留較好的可調(diào)試信息的前提下提供合理的優(yōu)化

        GCC常用選項(xiàng)
        • -E: 預(yù)處理

        • -S: 編譯

        • -c: 編譯 匯編 不鏈接

        • -g: 包含調(diào)試信息

        • -I: 指定include頭文件目錄

        • -o: 輸出編譯文件

        • -w: 忽略所有警告

        • -Werror: 不區(qū)分警告和錯(cuò)誤,遇到任何警告都停止編譯

        • -Wall: 開(kāi)啟大部分告警提示

        • -Wshadow: 作用域相關(guān)存在變量同名時(shí)發(fā)出告警

        • -Wextra: 對(duì)所有合法但值得懷疑的表達(dá)式發(fā)出告警


        ref: gcc.gnu.org/onlinedocs/


        *博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。



        關(guān)鍵詞: gcc

        相關(guān)推薦

        技術(shù)專(zhuān)區(qū)

        關(guān)閉