2011-07-16 188 views
3

我正在嘗試使用GCC編譯優化來在我的C代碼中設置全局優化。 Ubuntu上的GCC版本是4.4.3。基本思想是使用功能特定的優化級別。使用#pragma G代碼優化的C代碼優化

#pragma GCC optimize ("O3") 

我得到一個編譯錯誤 只是我在我的C代碼main函數之前

但是,當我建立它,我得到的編譯錯誤如下 -

passrecovery.c: In function âmainâ: 
passrecovery.c:493: internal compiler error: Segmentation fault 
Please submit a full bug report, 
with preprocessed source if appropriate. 
See <file:///usr/share/doc/gcc-4.4/README.Bugs> for instructions. 
make: *** [all] Error 1 

我檢查的自述.Bugs文件,在錯誤中提到,但沒有發現關於此的線索。

是否支持4.4.3 GCC或#pragma optimize

如果是的話,那麼我在使用這個編譯指示來優化代碼時做得不正確。

任何其他替代GCC指令用於優化速度代碼?

編輯:我甚至嘗試#pragma GCC push_options然後#pragma GCC optimize ("O3")和文件#pragma GCC pop_options結束;同樣的錯誤。

回答

8

的ICE(內部編譯器錯誤),導致分割故障始終是一個錯誤的編譯器,這就是爲什麼它要求你報告錯誤。您應該無法使用任何有效或無效的源代碼崩潰編譯器。 (有各種各樣的事情可能發生,通常涉及拒絕編譯無效代碼,但崩潰不是其中之一。)

由於GCC 4.6.1是最新的,爲什麼不考慮升級到GCC的更新版本(不是4.4.3都是舊版本)。

在提交錯誤報告之前,您應該儘量減少您的複製。 494行之後的所有內容可能都不重要;幸運的是,您可以將第1行和第493行之間的材料從近500個減少到20個左右。您當然應該儘可能減少它,同時保留錯誤。在開始切割代碼之前,請保留使編譯器崩潰的版本。當您在保留崩潰的同時成功移除代碼時,請檢查每個後續版本到您的VCS中。 (你使用VCS,是不是?這是一個反問題;如果你不是,現在是開始的好時機,你需要一個避免做出無法撤消的改變。非標準頭文件(你寫的)在消除標準頭文件之前。儘量擺脫儘可能多的標題。請注意預處理源的請求 - 我正在談論的代碼減少會減少預處理源的大小。

+0

僅供參考我試圖在main()上使用這個優化指令。這似乎是問題所在。這個指令工作正常(Atleast編譯正常),如果在其他函數上使用(除了main) – goldenmean

+0

@想要更多的眼球檢查導致這個的代碼。只有這個代碼使用的庫是-lcrypt(crypt.h),string.h,stdio.h,stdlib.h,ctype.h。 – goldenmean

+0

@goldenmean:建議嘗試刪除「」以及首先依賴它的內容......第二。你應該看看前490行的內容,看看哪些可以批量刪除,同時保持崩潰。您可以先使用評論,然後刪除它們。有可能無法移動任何代碼行。但這不太可能。每一行刪除都是有益的。你的程序沒有使用你自己的頭文件可以簡化生活。 –

4

對於最後一個問題:你可以把它變成一個獨立的編譯單元,並使用命令行開關:-O3