檢視來源
出自wiki.gentoo.tw
Desktop cflags
的原始碼
跳轉到:
導航
,
搜尋
根據以下的原因,您並無權限去做編輯頁面:
您剛才的請求只有
用戶
使用者組的使用者才能使用。
你可以檢視並複製本頁面的原始碼。
== CFLAGS 選項 == 再來,讓我們看看 gcc 中關鍵的幾個選項。這裡只簡單介紹這些選項的功能,若要詳細說明請參考 man gcc。 增加選項的數量,同時也增加編譯的時間。所有的選項都會增加編譯時間,有特別說明 "會增加編譯時間" 的選項,表示會增加 "大量的" 編譯時間 (跟其他選項比起來...)。 === 比較安全的選項 === 首先是安全的選項: * 指令 ** 參數與用法 [註二] ** 說明 ** 建議 * -O ** -O (-O1), -O0, -O2, -O3, -Os ** 依照後面數字的大小,針對效能最佳化的程度也不同 (穩定度也可能遞減)。其中 -Os 是個比較特殊的等級,針對原始碼大小最佳化。 ** 一般不建議使用 -Os, 因為 Os 會打破程式碼的 align, 為了處理未對齊的程式碼可能會需要更多的 cpu 運算 * -fforce-mem<br />-fforce-addr ** -fforce-mem, -fno-force-mem<br />-fforce-addr, -fno-force-addr ** 強制在運算前將記憶體中的數值 (mem) 或記憶體位置 (addr) 複製到暫存器中。啟動這兩個選項可以做出較好的程式碼。 ** 這兩個是好東西,啟動它們!其中 -fforce-mem 已在 -O2, -O3, -Os 中啟動,所以若您有用這三個選項的其中一個,只要 -fforce-addr 就夠了。 * -fomit-frame-pointer ** -fomit-frame-pointer, -fno-omit-frame-pointer ** 若非必要,不將函式的 frame pointer 放進暫存器中。這將避免您的程式儲存、設定、以及還原 frame pointer;也在許多函式中省下一個暫存器。'''在某些平台上,開啟這個選項將無法進行除錯!'''若平台支援不使用 frame pointer 除錯,這個選項將在 -O, -O2, -O3, -Os 中啟動。 ** 很抱歉, x86 剛好是需要 frame pointer 才能進行除錯的平台之一。但是... 您想對您的桌面進行除錯嗎?若答案為非,您可以放心啟動這個選項。 ** 註:gcc 4.0 使用了另一種除錯技術,可以安全使用(需要 gdb 6.1 ) * -finline-functions ** -finline-functions, -fno-inline-functions ** 將所有簡單的函式整合進呼叫他們的函式中。編譯器會自動試探並決定那些函式值得被整合。於 -O3 時啟動。 ** 雖然這個選項會增加程式大小,但是他卻是個增進效能的好東西。我建議您在這裡啟動它,然後使用下面一個指令指定 inline 條件。 * -finline-limit ** -finline-limit=n ** n 為決定函式是否能被 inline 的虛擬指令長度。預設的值為 600。 ** 這個數值越小,程式啟動的速度越快,但是運算的速度越慢。作為桌面使用,我建議 -finline-limit=400。 * -fmove-all-movables<br />-freduce-all-givs ** -fmove-all-movables, -fno-move-all-moveables<br />-freduce-all-givs, -fno-redduse-all-givs ** 這兩個是迴圈最佳化技術,將無關迴圈內容的運算改在迴圈外執行。編譯出的執行檔可能更快也可能更慢,結果跟程式的寫法有很大的關係。 ** 雖然說效能跟程式寫法有關,但是大部份的狀況下這兩個選項會做出比較小與比較快的程式碼,所以我建議您啟動他們! **註:gcc 4.0 的最佳化系統已變更,不需要 -fmove-all-movables, -freduce-all-givs * -freorder-blocks<br />-freorder-functions ** -freorder-blocks, -fno-reorder-blocks<br />-freorder-functions, -fno-reorder-functions ** 藉由重新編排程式區塊來增進效能以及減少執行檔大小。 ** 這兩個也是好東西,所以我建議您啟動它們。缺點是會讓編譯時間變長。 ** -freorder-blocks 於 -O2, -O3 時啟動,於 -Os 中關閉。-freorder-functions 於 -O2, -O3, -Os 時啟動。 * -fexpensive-optimizations ** -fexpensive-optimizations, -fno-expensive-optimizations ** 執行幾個會加長編譯時間的非主要最佳化程序。於 -O2, -O3, -Os 中預設開啟。 ** 雖然會增加編譯時間,但是能增加效能也能減少執行檔大小,所以建議啟用。 * -falign-functions<br />-falign-labels<br />-falign-loops<br />-falign-jumps ** -falign-functions, -falign-functions=n<br />-falign-labels, -falign-labels=n<br />-falign-loops, -falign-loops=n<br />-falign-jumps, -falign-jumps=n ** 依照大於 n 的最小 2 的次方位元組對齊函式 (functions)、標籤 (labels)、迴圈 (loops)、跳躍 (jumps) 的起頭,跳過至多 n 位元組。 ** 我知道這很抽象,解釋起來要花很多篇幅,所以請各位使用預設值,亦即指定 -falign-functions, -falign-labels, -falign-loops, -falign-jumps,但是不指定 =n。於 -O2, -O3 時啟動。於 -Os 中關閉。 * -frename-registers ** -frename-registers, -fno-rename-registers ** 在作過暫存器定位之後,使用剩下來的暫存器。這個最佳化在有很多暫存器的 CPU 上最明顯 (如 ARM、PowerPC... 等。x86 不屬於他們的一份子)。會增加除錯的困難度。 ** 雖然在 x86 上不明顯,但是還是有用。而且 x86-64 提供更多的暫存器,所以建議您還是應該打開它。於 -O3 時啟動。 * -fweb ** -fweb, -fno-web ** 建立經常使用的暫存器網路。提供更佳的暫存器使用率。不過也會增加除錯的困難度。 ** 這個選項在 x86-64 平台上作 32-bit 編譯時很有效。 ** 這個是安全選項中比較偏向實驗性質的選項,雖然建議您啟動,但是若啟動之後程式不穩,請將它關閉。於 -O3 時啟動。 === 實驗性質的選項 === 以下是真的實驗性質的東西,若啟動之後系統不穩,請將他們關閉。 * 指令 ** 參數與用法 ** 說明 ** 建議 * -ffast-math ** -ffast-math, -fno-fast-math ** 設定 -fno-math-errno, -funsafe-math-optimizations, -fno-trapping-math, -ffinite-math-only, -fno-rounding-math, 以及 -fno-signaling-nans 這幾個選項,以及設定預先處理器的 __FAST_MATH__ 巨集。這些技術雖然較快,但是違反 IEEE 或 ISO 的規則,並且很有可能讓程式算出錯誤的數值。 ** 這是危險的東西,可能造成運算結果的錯誤 (1.1+1.2=1.4!?當然沒那麼離譜啦...),建議不使用。 ** 註:ffast-math 通常使用該 CPU 的特定指令,即以 SSE/SSE2/3DNOW 等提升效能 * -funit-at-a-time ** -funit-at-a-time, -fno-unit-at-a-time ** 在製作執行檔前分析整個編譯單位。提供某些額外最佳化套用的機會,但會使用更多記憶體。 ** 這個東西還蠻安全的,請放心使用它! * -funroll-loops<br />-fold-unroll-loops ** -funroll-loops, -fno-unroll-loops<br />-fold-unroll-loops, -fno-old-unroll-loops ** 展開可以在編譯階段決定次數的迴圈,可能讓程式執行的更快或更慢。-fold-unroll-loops 使用舊的演算法。 ** 由於這個會讓程式變大許多,所以建議不使用。 * -funroll-all-loops<br />-fold-unroll-all-loops ** -funroll-all-loops, -fno-unroll-all-loops<br />-fold-unroll-all-loops, -fno-old-unroll-all-loops ** 即使迴圈執行次數不確定,還是將所有迴圈展開。大部份狀況下會讓程式跑得更慢。 ** 又比較慢又會變大,所以別用... * -fprefetch-loop-arrays ** -fprefetch-loop-arrays, -fno-prefetch-loop-arrays ** 若目標機器支援,在存取大型陣列迴圈執行之前預先將陣列載入至記憶體。於 -Os 中關閉。 ** 其實不太會有需要存取大型陣列的迴圈 (多媒體、資料庫、科學計算軟體中才比較常見),所以您可以放心將此選項關閉。 * -ffunction-sections<br />-fdata-sections ** -ffunction-sections, -fno-function-sections<br />-fdata-sections, -fno-data-sections ** 將函式或資料物品放至自己的區段中。大部份使用 ELF 目標格式的系統以及執行 Solaris 2 的 SPARC 系統支援這些最佳化。會增加連結過程的時間,以及增加執行檔大小,也會增加除錯的困難。 ** 在我的經驗中,沒有特別顯著的效果,而且執行檔會變大,所以建議不使用。 * -fbranch-target-load-optimize<br />-fbranch-target-load-optimize2 ** -fbranch-target-load-optimize, -fno-branch-target-load-optimize<br />-fbranch-target-load-optimize2, -fno-branch-target-load-optimize2 ** 在執行序啟動以及結尾之前執行枝節目標暫存器載入最佳化。 ** 這是進階最佳化選項,建議您兩個都啟動。 === 平台相關選項 === 最後是 x86 與 x86-64 相關的選項: * 指令 ** 參數與用法 ** 說明 ** 建議 * -mcpu (已過期,可能在以後版本中移除。)<br />-mtune<br />-march ** -mcpu=cpu-type<br />-march=cpu-type<br />-mtune=cpu-type ** 依照不同的目標處理器進行最佳化。注意,若您指定了 -march,製作出的執行檔將無法在其他 CPU 上使用。但是若光指定 -mtune,gcc 會避免使用平台專有指令集跟專用排程選項。可用的選項有: *** i386:標準的 Intel i386 處理器 *** i486:Intel 的 i486 處理器 (沒有排程實作) *** i586, pentium:沒有 MMX 指令集的 Intel Pentium 處理器 *** pentium-mmx:支援 MMX 指令集的 Intel PentiumMMX 處理器 *** i686, pentiumpro:Intel PentiumPro 處理器 *** pentium2:支援 MMX 指令集的 Intel Pentium2 處理器 *** pentium3:支援 MMX 與 SSE 指令集的 Intel Pentium3 處理器 *** pentium4:支援 MMX、SSE 與 SSE2 指令集的 Intel Pentium4 處理器 *** pentium-m:支援 MMX、SSE 與 SSE2 指令集的 Intel Pentium-M 處理器, GCC 3.4 以後才提供. *** k6:支援 MMX 指令集的 AMD K6 處理器 *** k6-2, k6-3:支援 MMX 與 3DNow! 指令集的進階版 AMD K6 處理器 *** athlon, athlon-tbird:支援 MMX、 3DNow!、加強版 3DNow! 以及 SSE 預先載入指令集的 AMD Athlon 處理器 *** athlon-4, athlon-xp, athlon-mp:支援 MMX、 3DNow!、加強版 3DNow! 以及完整 SSE 指令集的 AMD Athlon 處理器 *** k8, opteron, athlon64, athlon-fx:支援 x86-64 指令集,以 AMD K8 核心為基礎的處理器。(支援 MMX、SSE、SSE2、3DNow!、加強版 3DNow! 以及 64 位元指令集。) *** winchip-c6:IDT Winchip C6 處理器,以支援 MMX 指令集的 i486 處理。 *** winchip2:IDT Winchip2 處理器,以支援 MMX 及 3DNow! 指令集的 i486 處理。 *** c3:支援 MMX 及 3DNow! 指令集的 Via C3 處理器 (沒有排程實作) *** c3-2:支援 MMX 及 SSE 指令集的 Via C3 處理器 (沒有排程實作) ** 請依照您的系統指定 -march 與 -mtune,例如我的系統使用的是 "-march=athlon-xp -mtune=athlon-xp"。 * -mfpmath ** -mfpmath=unit ** 依照選擇的單位製作執行檔。可用的單位有: *** 387:使用標準的 387 浮點運算處理單元,為 i386 預設值。 *** sse:使用 SSE 指令集提供的浮點運算處理指令,可以透過 -msse 或 -msse2 來啟用。在 x86-64 平台上,這個選項是預設啟用的。 *** sse,387:使用標準 387 浮點運算處理單元與 SSE 指令集,這將提供將近一倍的額外暫存器,以及可能增加浮點運算處理效能。小心使用這個選項,因為這個技術還處於實驗性質,可能造成系統不穩。 ** 若您使用支援 SSE 的處理器,可以嘗試使用比較快的 -mfpmath=sse,387。若您比較膽小 (怕當機),可以使用 -mfpmath=sse。 ** 註:移動 sse 暫存器的資料至 387 的處理速度很慢。在大部分測試中,sse,387 的效能比 sse 慢。 * -mmmx<br />-msse<br />-msse2<br />-msse3<br />-m3dnow ** -mmmx, -mno-mmx<br />-msse, -mno-sse<br />-msse2, -mno-sse2<br />-msse3, -mno-sse3<br />-m3dnow, -mno-3dnow ** 啟動或關閉指令集支援。 ** 請依照您的系統啟動或關閉這些指令集支援。有關處理器支援的指令集,可透過 cat /proc/cpuinfo 來查詢。 * -maccumulate-outgoing-args ** -maccumulate-outgoing-args, -mno-accumulate-outgoing-args ** 在函式起始時,計算輸出參數所需的空間。在大部份現代處理器上,由於降低依存性、增進排程、以及在堆疊分界不等於 2 的時候降低堆疊使用率,這個選項可以增加一些效能。缺點是執行檔會變大。 ** 由於執行檔會變大,所以不太建議使用。 * -malign-stringops ** -malign-stringops, -mno-align-stringops ** 決定是否將整合進原始碼的目標字串運算元對齊。這可以縮小執行檔大小,以及在目標字串運算元已經對齊時增加一些效能。 ** 兩面刃,所以請自己決定... * -minline-all-stringops ** -minline-all-stringops, -mno-inline-all-stringops ** 預設中 GCC 只將知道目的地會被對齊在 4bytes 界線的字串運算元整合進程式碼。這個選項啟動更多的整合,增加執行檔大小,不過可能會增加需要快速 memcpy, strlen 以及 memset 的程式。 ** 由於會增加程式碼大小,而又不是那麼多程式會使用 memcpy/strlen/memset 等函式,所以建議不使用。 === 其他選項 === 其他與最佳化無關的 CFLAGS: * -pipe ** -pipe ** 於程序間通訊時使用管線,而不是暫存檔。GNU 組譯器支援此選項。 ** 可以縮短一些編譯時間,建議使用。
返回到
Desktop cflags
.
檢視
頁面
討論
檢視來源
歷史
個人工具
登入/建立新帳號
導航
首頁
社群入口
最近活動
近期變動
隨機頁面
幫助
搜索
工具箱
哪些網頁連結到此
相關變更
特殊頁面