據我所知,你最關心的是編譯時間和庫的可維護性?
首先,不要試圖一次性「修復」。
其次,明白你修好了什麼。模板的複雜性經常出於某種原因,例如執行某些用途,並使編譯器幫助你不犯錯誤。這個原因有時可能會被採用到很遠,但是拋出100條線是因爲「沒有人真的知道他們做了什麼」不應該被忽略。我在這裏建議的一切都可以引入真正令人討厭的錯誤,你已經受到警告。
第三,首先考慮更便宜的修復:例如,更快的機器或分佈式構建工具。至少要扔掉所有的板子,然後扔掉舊的磁盤。它確實會產生差異。一個驅動器的操作系統,一個驅動器的構建是一個便宜的男人RAID。
圖書館是否有詳細記錄?這是您最好的機會,可以查看諸如doxygen等工具來幫助您創建這樣的文檔。
全部考慮?好了,現在一些建議,爲構建時間;)
瞭解C++ build model:每次的.cpp單獨編譯。這意味着許多頭文件很多.cpp文件=巨大的構建。這不是建議將所有內容放入一個.cpp文件,但!但是,一個可以加速編譯速度的技巧(!)是創建一個包含一堆.cpp文件的.cpp文件,並且只將該「主」文件提供給編譯器。但是,你不能盲目做這件事 - 你需要了解可能引入的錯誤類型。
如果你還沒有一個,得到一個單獨的生成機,你可以遠程進入。你將不得不做很多幾乎完整的構建來檢查你是否打破了一些包含。你會想在另一臺機器上運行它,這並不會阻止你在其他機器上工作。長期來看,無論如何,您都需要它進行日常集成構建;)
使用預編譯頭文件。 (使用快速機器可以更好地進行縮放,參見上文)
檢查標題包含策略。雖然每個文件都應該是「獨立的」(即包括其他人需要包含的所有內容),但不要寬泛地包含。不幸的是,我還沒有找到找到不必要的#incldue語句的工具,但它可能有助於花費一些時間去除「熱點」文件中未使用的標題。
爲您使用的模板創建並使用正向聲明。通常情況下,您可以在許多地方使用forwad聲明來包含頭文件,並且僅在少數特定的頭文件中使用完整頭文件。這可以極大地幫助編譯時間。檢查<iosfwd>
標題標準庫如何處理I/O流。
重載少品種模板:如果你有一個複雜的函數模板只爲極少數類型,如這是有用的:
// .h
template <typename FLOAT> // float or double only
FLOAT CalcIt(int len, FLOAT * values) { ... }
可以聲明在標題中過載和動模板到身體:
// .h
float CalcIt(int len, float * values);
double CalcIt(int len, double * values);
// .cpp
template <typename FLOAT> // float or double only
FLOAT CalcItT(int len, FLOAT * values) { ... }
float CalcIt(int len, float * values) { return CalcItT(len, values); }
double CalcIt(int len, double * values) { return CalcItT(len, values); }
這將冗長的模板移動到單個編譯單元。
不幸的是,這只是對類的有限使用。
檢查the PIMPL idiom是否可以將代碼從頭文件移動到.cpp文件中。
隱藏在那裏的一般規則是將庫的接口與實現分開。請使用註釋detail
命名空間和單獨的.impl.h
標題,從頭腦到物理隔離外部應該知道的內容和完成的方式。這暴露了你的庫的真正價值(它實際上是否封裝了複雜性?),並且讓你有機會首先替換「簡單目標」。
更具體的建議 - 以及如何有用的給予是 - 很大程度上取決於實際的圖書館。
祝你好運!
好點!感謝讓我以不同的方向思考。 – 2008-11-27 17:22:40