Effective C++ 条款44
来源:互联网 发布:手机文档解密软件 编辑:程序博客网 时间:2024/05/27 09:48
本节条款的标题是:将与参数无关的代码抽离templates
学习本节条款首先需要明白一件事情,那就是模板实例化的过程会不会重复?
我们来举个例子:
#include<iostream>using namespace std;template <typename T>T Try(T m){ return m;}int main(){ Try(10); Try(1);}
我们看以上简单的代码,每个人都知道模板被调用了两次,是的,这显而易见。可是模板也被实例化了两次吗?事实上,模板只实例化了一次。
我们再举个例子:
#include<iostream>using namespace std;template <typename T>T Try(T m){ return m;}int main(){ Try(10); Try(1.01);//注意!此时是一个double型}
这个时候每个人都知道模板被调用了两次。模板也被实例化了两次吗?事实上,模板确实实例化了两次。
比较以上两个例子,大家明白了什么?那就是,模板函数的实例化次数和调用次数没有直接关系,而是和调用类型的种类有关。同种类型如果已经调用,模板函数会重复利用上次的实例化例子,而不会重新分配内存实例化。如果,大家明白这一点本节条款就能理解了。
我们利用template就是为了让代码编写更简短,利用内存更小。可是,一般情况下很多程序员只能做到第一步,而不能充分在内存中发挥代码的复用性。
如下书上例子:
template<typename T, std::size_t n>//T为数据类型,n为矩阵大小 class SquareMatrix{ public: …… void invert();//求逆运算 }; SquareMatrix<double,5> sm1; sm1.invert();//调用SquareMatrix<double,5>::invert SquareMatrix<double,10> sm2; sm2.invert();//调用SquareMatrix<double,10>::invert
上面的代码会在执行的过程中,具体化两份invert()函数。这两份函数几乎完全相同,所以对于内存来说是种浪费。如果想要弥补这种缺点,我们可以用以下对比例子:
template<typename T>class SquareMatrixBase{public: SquareMatrixBase(T* p) : DataPointer(p){} void Invert(size_t n){}private: T* DataPointer;};template <typename T, size_t n>class SquareMatrix: private SquareMatrixBase<T>{public: SquareMatrix() : SquareMatrixBase(Data) {} void Invert() { SquareMatrixBase::Invert(n); }private: T Data[n * n];}; SquareMatrix<double,5> sm1; sm1.invert(); SquareMatrix<double,10> sm2; sm2.invert();
当我们再次调用以上语句时,SquareMatrixBase类的实例在内存中只生成一次。因为每次调用都是double 型的SquareMatrixBase。然后矩阵数据是用指针访问,同一种数据不会被拷贝多份,这样也减少了内存利用。
总之,以下三条很重要:
1. Template生成多个classes与多个函数,所以任何template代码都不该与某个造成膨胀的template参数产生相依关系。
2. 因非类型模板参数而造成的代码膨胀,往往可以消除,做法是以函数参数或者class成员变量替换template参数。
3. 因类型而造成的代码膨胀,也可以降低,做法是让带有完全相同二进制表述的具现类型共享实现码。
- 《Effective C++》:条款44-条款45
- Effective C++(条款41-44)
- Effective C++:条款01
- Effective C++:条款02
- Effective C++:条款03
- Effective C++:条款04
- Effective C++:条款05
- Effective C++:条款06
- Effective C++:条款07
- Effective C++:条款08
- 《effective C++》条款三
- 《effective C++》条款5
- 《effective C++》条款六
- Effective C++--经验条款
- Effective C ++ 条款34
- 《Effective C++》条款05
- 《Effective C++》条款06
- 《Effective C++》条款08
- 简单的内存对齐
- 委托和接口
- 00000000000000000
- WaitForMultipleObjects使用详解
- hdu1010 Tempter of the Bone
- Effective C++ 条款44
- 编程技术面试的五大要点
- flash中声音的控制
- all of these is operation
- Android4.0代码目录结构
- 五子棋AI算法浅谈
- 慎用Outline ,UGUI Outline实现原理分析
- 380多个梦想的力量
- java http get、post方式