gcc編譯大文件非常慢,是有什麼限制嗎?
01-05
一個很大的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++應該怎麼學?