標籤:

gcc編譯大文件非常慢,是有什麼限制嗎?

一個很大的cpp文件(超過200mb),裡面存儲的是大量的全局數組,類似這樣的:

const uint8_t data1[] = {1,3,4,6,2,1.......};

const uint8_t data2[] = {1,3,4,6,2,1.......};

const uint8_t data3[] = {1,3,4,6,2,1.......};

const uint8_t data4[] = {1,3,4,6,2,1.......};

......

......

......

VS編譯速度還不錯,分把鐘的樣子,但是gcc編譯的話需要一兩個小時。請問是否有什麼限制?

PS:這麼做的目的簡單來說就是希望把業務數據直接編譯到程序里,啟動就可以使用,也不需要載入外部文件。

----------------------------------------------

提示:Code Hz 給出了Linux的解法,輪子哥vczh 給出了Windows的解法,感興趣的可直接移步他們的答案!


不知道gcc怎麼做,但是如果是VC++的話,你可以把這些東西寫進一個二進位文件,然後告訴編譯器當資源塞進你的exe裡面,啟動的時候調用API讀出來,毫秒級編譯啟動,還不會因為添加了大量的難以修改的C++代碼給開發人員造成負擔。


你這種寫法好詭異。

可以考慮把數據存資料庫,然後程序啟動後載入也很快啊。像sqlite也很輕量。以後數據改變還不用重編程序。


你可以試試看把所有的數據做成單個變數而不是N個數組,應該能提升一些編譯效率。當然Windows下更推薦使用資源,200M輕輕鬆鬆。


這種情況下,不妨把const改成static const,讓編譯器知道這些東西永不改變,再看看編譯速度。


講道理vs可以用資源文件,不過是ide的自動處理罷了(沒有任何貶低的意思),你要想在gcc上用,得需要ld 傳送門http://stackoverflow.com/questions/4158900/embedding-resources-in-executable-using-gcc


這麼標準的只讀數組,按輪子哥的做法最合適了,文件化-&>資源化


知乎有過另外一個問題,那個是把幾百兆的sql語句編譯進了可執行文件,結果是編譯和運行都比正常方法慢多了。


gcc工具鏈更方便,objcopy


想要程序啟動就能用,可是你啟動程序還是要從硬碟上讀程序的數據,都有同樣的導入數據的過程,不會有太大的提升吧。


推薦閱讀:

為何C++/Rust都不允許靜態函數是虛的?
如何優化一個讀取命令並執行的程序?
C++的完美轉發只能針對形如T &&的形參嗎?
現在C++開發是不是都遵守C++11標準,Linux下的多線程編程是優先考慮C++11的線程庫,還是用系統線程API封裝?
大學C++應該怎麼學?

TAG:C | CC | GCC | 編譯 |