http://www.cnblogs.com/royenhome/archive/2010/11/19/1881535.html
文章来源:http://group.gimoo.net/review/82612
templates(模板)是节省时间和避免代码重复的极好方法,我们可以只输入一个类模板,就能让编译器实例化所需要的很多个特定类及函数。类模板的成员函数只有被使用时才会被实例化,下面就是work被实例化了4次,所以只有在每一个函数都在实际中被使用时,我们才会得到这些函数。
确实这是一个很重要的技术,但是如果不小心,使用模板可能会导致代码膨胀。什么是代码膨胀?请看下面的例子:6 { static int i = 0;
7 cout < < "work() " < <i++<< endl;如何避免由于这种代码膨胀呢?有一个原则,就是把C++模板中与参数无关的代码分离出来。也就是让与参数无关的代码只有一份拷贝。对类模板A可以进行如下地修改:
(模版类的出现,就是代替了人工拷贝的过程,但是在编译期间由编译器进行拷贝。在上面的例子中,编译器首先生成4个类,然后再产生对应的对象。很明显,work函数的功能一致,却被拷贝了四次。在下面的实现中,可以想象,也是有4个类A <int, 1>,A <int, 2>,A <int, 3>,A <int, 4>,但是这四个类都继承一个base<int>,其中派生类的work函数还是会生成4份,但是都调用了base<int>中的work函数,但是base<int>中的work函数只有一份)
1 template <class T>程序中work的参数版本是在一个Base类(基类)中的。与Derived类一样,Base类也是一个类模板,但是与Derived类不一样的是,它参数化的仅仅是类型T,而没有num。因此,所有持有一个给定类型的Derived将共享一个单一的Base类。比如代码24~26行实例化的模板类都共享Base <int>模板类,从而他们的成员函数都共享Base <int>模板类中的work这个单一的拷贝。
模板的缺点:不当地使用模板会导致代码膨胀,即二进制代码臃肿而松散,会严重影响程序的运行效率。
解决方法:把C++模板中与参数无关的代码分离出来。