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

C++ 模板程式碼膨脹優化:提取參數無關程式碼至基類別

     編輯:關於C++

問題

模板每種具現化型別都會產生完整程式碼,導致程式碼膨脹。若部分邏輯與模板參數無關,應提取至非模板基類別。

技巧:私有繼承基類別 + inline 轉發

/* test.cpp
 * Created on: 2014.04.20
 * Author: Spike
 */
#include <iostream>
#include <boost/scoped_array.hpp>
using namespace std;

template <typename T>
class SquareMatrixBase {
protected:
    SquareMatrixBase(size_t n, T* pMem) : size(n), pData(pMem) {}
    void setDataPtr(T* ptr) { pData = ptr; }
    void invertBase() { cout << " pData[0] = " << pData[0] << endl; }
private:
    size_t size;
    T* pData;
};

template <typename T, size_t n>
class SquareMatrix : private SquareMatrixBase<T> {
public:
    SquareMatrix() : SquareMatrixBase<T>(n, nullptr), pData(new T[n*n]) {
        this->setDataPtr(pData.get());
    }
    void setData() { for (int i=0;i<n*n;++i) pData[i]=9; }
    void invert() { this->invertBase(); }
private:
    boost::scoped_array<T> pData;
};

int main() {
    SquareMatrix<int, 3> sm; sm.setData(); sm.invert();
    SquareMatrix<int, 5> sm2; sm2.setData(); sm2.invert();
}

輸出

pData[0] = 9
pData[0] = 9

優化效果

  • invertBase 非模板函式,僅產生一份程式碼,所有具現化共用。
  • 私有繼承隱藏基類別介面,inline 轉發消除呼叫開銷。
  • 適用於大型矩陣運算、容器實作等模板類別。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved