Effective C++ 读书笔记 Item 44

来源:互联网 发布:ib课程网络教学 编辑:程序博客网 时间:2024/04/30 01:34

Item 44: Factor parameter-independent code out of templates.


这个Item主要讲由于使用模板造成的代码区膨胀的问题。常见的一种情况是使用了non-type模板参数。例如

template<typename T, std::size_t n>class SquareMatrix {  ...  void invert();};SquareMatrix<double, 5> sm1;SquareMatrix<double, 10> sm2;
于是c++编译器会给生成SquareMatrix<double, 5>::invert和SquareMatrix<double, 10>::insert两个版本的函数。

解决办法是再写一个基类,在基类中写一个参数为std::size_t的invert函数,然后在SquareMatrix中调用insert(size_t n)函数,并讲invert()设置为inline,这样就只会编译有一个版本的invert()函数。

  template<typename T>  class SquareMatrixBase {   protected:    SquareMatrixBase(std::size_t n, T* pMem)      :size(n), pData(pMem) {}    void setDataPtr(T* ptr) { pData = ptr; }    void insert(); //不能inline,否则仍然生成多个版本。    ...   private:    std::size_t size;    T* pdata;  };    template<typename T, std::size_t n>    class SquareMatrix: private SquareMatrixBase<T> { //private继承只需要继承实现   private:     using SquareMatrixBase::invert;   public:    SquareMatrix() : SquareMatrixBase<T>(n, data) {} //不清楚为什么data能在初始化之前传给父类。 应该是地址已经确定,但是内容没有初始化    void invert() { invert(n); }  // 用inline提高效率   private:    T data[n*n];  }

好处在于代码段的减少有助于提高指令集的cache

对于type的模板参数,可以对相同的binary representations的类型共享代码。 T* function calls void* function