給定模板元程序(TMP),C++編譯器是否會生成構建統計信息來計算實例化類的數量?或者有沒有其他方法可以自動獲得這個數字?因此對於例如所述obiquitous階乘自動計算TMP中實例化類的數量?
#include <iostream>
template<int N> struct fact { enum { value = N * fact<N-1>::value }; };
template<> struct fact<1> { enum { value = 1 }; };
int main()
{
const int x = fact<3>::value;
std::cout << x << "\n";
return 0;
}
我想取回號3(因爲實際上< 3>,事實上< 2>,和事實上< 1>被實例化)。這個例子當然不重要,但是當你開始使用例如Boost.MPL,編譯時間真的爆炸了,我想知道有多少是由於隱藏的類實例。我的問題主要是針對Visual C++,但是對於gcc的回答也是值得讚賞的。
編輯:爲Visual C++從斯蒂芬T. Lavavej的videos/d1reportAllClassLayout之一加入編譯開關,這樣做對輸出文件的grep +字數,但它(一)增加編制我目前非常脆弱的方法次數巨大和(b)正則表達式很難100%正確。
+1。我建議,應該很容易地破解任何開源編譯器,但是實際上以最好的方式證明了它(通過編寫一個實際上可以實現的補丁)。 – abarnert 2012-07-10 01:19:05
謝謝!什麼會更方便(是的,範圍蔓延!)是所有類模板的日誌和它們的實例化的數量,而不僅僅是所有實例的總數或整個列表。也許一個perl腳本來後處理完整的構建日誌是我應該嘗試的。 – TemplateRex 2012-07-10 06:11:58
只是輸出到'awk -F'<''{templates [$ 1] ++} END {for(t in templates)print t,templates [t]}'' – 2012-07-10 09:11:38