2009-04-28 20 views
28

我剛剛開始在Linux上使用g ++編譯器,並在編譯器標誌上提出了一些問題。以下是他們使用g ++製作靜態庫的優化和標誌

優化

我讀到的優化參數-O1,在G ++手冊頁-O2-O3。我不明白何時使用這些標誌。通常你使用什麼優化級別? g ++手冊爲-O2說了以下內容。

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

如果不進行內聯和循環展開,如何實現上述性能並且建議使用此選項?

靜態庫

如何創建使用克靜態庫++?在Visual Studio中,我可以選擇一個類庫項目,並將其編譯爲「lib」文件。 g ++中的等效物是什麼?

+1

[2003年,海灣合作委員會的-O3是越野車,並得到一個壞的說唱。](http://stackoverflow.com/a/11546263/845092)現在它只會產生錯誤的代碼,當你違反規則,但人們喜歡破規則,並在發生後果時生氣,所以他們堅持-O2來避免編寫非法代碼的後果。 – 2014-01-31 21:00:11

回答

2

編譯器可以執行的許多優化,除了循環展開和內聯。循環展開和內聯在那裏被特別提及,儘管它們使代碼更快,但它們也使它更大。

要創建靜態庫,請使用'g ++ -c'生成.o文件和'ar'以將它們歸檔到庫中。

+0

謝謝。什麼是「ar」?那是一個g ++編譯器開關還是一個shell?如果你能告訴我如何使用「ar」,那將是非常好的。 – 2009-04-28 04:11:28

+0

沒問題。我檢查了「ar」並找到了它的手冊。非常感謝您的支持 – 2009-04-28 04:16:38

4

關於何時使用什麼優化選項 - 沒有單一的正確答案。

某些優化級別有時可能會降低性能。這取決於您正在編寫的代碼的類型和其執行模式,並取決於您正在運行的特定CPU。 (爲了給出一個簡單的典型例子 - 編譯器可能決定使用一個優化,使得你的代碼比以前稍大一些,這可能會導致代碼的某些部分不再適合指令緩存,在這一點上需要更多的內存訪問 - 例如在一個循環中)。

無論你需要什麼,最好測量和優化。嘗試,衡量和決定。

一個重要的經驗法則 - 對代碼執行的優化越多,使用調試器調試它就越困難(或者讀取它的反彙編),因爲C/C++源代碼視圖遠離生成的二進制代碼。由於這個原因,在開發/調試時使用較少的優化是一個很好的經驗法則。

41

經驗法則:

當你需要調試,使用-O0(和-g生成調試符號)

當你正準備出貨,使用-02。

當您使用gentoo時,請使用-O3 ...!

當你需要把它在嵌入式系統上,使用OS(優化尺寸,而不是效率。)

5

GCC手冊列表中的每個優化級別的所有暗示的選項。在O2中,您可以獲得常量摺疊,分支預測和合作等功能,這可以根據您的代碼顯着改變應用程序的速度。確切的選項取決於版本,但詳細記錄在案。

要建立一個靜態庫,你可以使用AR如下:

ar rc libfoo.a foo.o foo2.o .... 
ranlib libfoo.a 

RANLIB並不總是必要的,但沒有理由不使用它。

0

關於靜態庫問題,David Cournapeau給出的答案是正確的,但是您可以使用's'標誌和'ar',而不是在靜態庫文件上運行ranlib。 'ar' manual page指出

在歸檔上運行ars相當於在其上運行ranlib。

無論使用哪種方法都只是個人喜好的問題。