模板每次實例化都會生成完整代碼副本。若模板包含與參數無關的代碼(非類型參數如 int N、或類型參數如 int/long 導致相同二進制表示),會造成二進制膨脹,增加指令緩存壓力、降低性能。
// 基類持有參數無關邏輯 templateclass SquareBase { protected: void invert(int size, T* data); // 參數化尺寸與數據指針 }; // 子類僅負責存儲與轉發 template class Square : private SquareBase { T data[N*N]; // 或動態分配 public: void invert() { this->invert(N, &data[0][0]); } // inline 轉發,零開銷 };
現在 invert 僅在 SquareBase<double> 中實例化一次,所有 Square<double, N> 共享。
T* data 和 int n,子類決定分配方式(棧上數組/堆上 new)。SquareBase(int _n, T* _data) : n(_n), data(_data) {}。即使底層表示相同(如 int/long、T*/const T*),不同類型參數也會觸發獨立實例化。解決思路:
void* 在基類操作,子類再 static_cast 回原類型。long long 或模板特化共享實現。| 優勢 | 劣勢 |
|---|---|
| 減小二進制體積、提高指令緩存命中率 | 失去編譯期常量傳播等優化機會 |
| 代碼復用、維護成本低 | 增加類層級、對象體積微增(額外指針) |
建議:性能敏感熱點路徑保留參數化;通用工具類、庫代碼優先提取公共基類。