我正在使用C++進行大學研究項目,其中有很多模板,它們有更多嵌套模板等等。該項目是針對特定研究領域的有效索引數據結構。你可以想象:一個索引結構有很多參數需要調整,所以我們過多地使用了模板參數。當然,我們想用不同的參數集來測試我們的索引,所以有很多模板實例化。如何使C++鏈接佔用更少的內存
該項目並不是那麼龐大。也許50k LOC。但是,鏈接需要50秒,並且消耗超過7 GB的內存(!!!)。我在32GB的工作站上,所以對我來說一切都很好。我經常有這個項目的學士和碩士學生。問題是他們經常在4或8 GB RAM的筆記本電腦上工作。因此,這些學生在編譯該項目時遇到了很大的麻煩。得到的測試二進制文件(即僅包含索引結構的單元測試的二進制文件)爲700兆字節。 大部分都是符號,因爲嵌套模板會產生巨大的名字。如果我在二進制文件上使用strip
,則它會下降到8兆字節。
那麼有沒有辦法在連接期間減少內存使用量?有沒有辦法讓嵌套模板具有更小的符號?
我們在Ubuntu 14.10下使用g ++ 4.9與std=c++11
進行編譯。
編輯:
它真的好像是嵌套模板。我們有兩個測試用例,其中嵌套的模板非常深。用於這些測試的兩個.o
文件構成了最終二進制文件的將近90%的內存。它們導致長度超過3000個字符的方法名稱。沒有辦法在這裏不使用嵌套模板,因爲它們形成示例查詢的「處理樹」。使用深度嵌套模板時,有什麼方法可以縮短名稱長度嗎?
什麼操作系統,編譯器版? – EdChum 2014-09-25 10:07:12
@EdChum:Ubuntu 14.10下的g ++ 4.9。現在將它添加到問題中。 – gexicide 2014-09-25 10:08:18
哪個C++版本? C++ 11有外部模板! – 2014-09-25 10:08:20