首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Effective C++ 條款 44:將參數無關代碼提取出模板,抑制代碼膨脹

     編輯:關於C++

問題:模板代碼膨脹

模板每次實例化都會生成完整代碼副本。若模板包含與參數無關的代碼(非類型參數如 int N、或類型參數如 int/long 導致相同二進制表示),會造成二進制膨脹,增加指令緩存壓力、降低性能。

經典案例:固定大小矩陣轉置

// 基類持有參數無關邏輯
template
class 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 或模板特化共享實現。

權衡取捨

優勢劣勢
減小二進制體積、提高指令緩存命中率失去編譯期常量傳播等優化機會
代碼復用、維護成本低增加類層級、對象體積微增(額外指針)

建議:性能敏感熱點路徑保留參數化;通用工具類、庫代碼優先提取公共基類。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved