条款44:将与参数无关的代码抽离 templates
Factor parameter-independent code out of templates.
使用 templates 可能会导致代码膨胀(code bloat):其二进制码带着重复的代码、数据,或两者。
template<typename T, std::size_t n>
class SquareMatrix {
public:
...
void invert();
};
SquareMatrix<double, 5> sm1;
SquareMatrix<double, 10> sm2; // 具现化出两个 SquareMatrix
对于因非类型模板参数(non-type template parameters)而造成的代码膨胀,可以进行消除:
template<typename T>
class SquareMatrixBase> {
protected:
...
void invert(std::size_t matrixSize);
...
};
template<typename T, std::size_t n>
class SquareMatrix: private SquareMatrixBase<T> {
private:
using SquareMatrixBase<T>::invert;
public:
void invert() { this->invert(n); }
};
对于因类型参数(type parameters)而造成的代码膨胀,往往可以降低,例如用基类中的指针记录数据存放的位置,替代了每次向 derived class 询问的操作:
template<typename T>
class SquareMatrixBase> {
protected:
SquareMatrixBase(std::size_t n, T* pMem): size(n), pData(pMem) { }
void setDataPtr(T* ptr) { pData = ptr; }
void invert(std::size_t matrixSize);
...
private:
std::size_t size;
T* pData;
};
Last updated
Was this helpful?