Item 44 与模板参数无关的代码

模板可以节省时间,减少代码的重复。
假设有20个类,每个类15个成员函数。那么可以用一个类模板来定义,然后由编译器去实例化所需要的类。
模板类的成员函数只在用到的时候才实例化。

过度使用模板会导致目标代码的膨胀。要通过共性/异性分析防止这种事情发生。

 

 

两份invert,很明显的代码重复。修改之后:

 

 

1> SquareMatrixBase是为了避免代码膨胀而定义的,所以其invert声明为protected,而非public。
2> 因为使用了内联,所以派生类调用基类的invert时间成本为零。
3> 必须使用this指针去调用基类的invert。详见Item 43。
4> 继承关系使用private,表示基类只是为了辅助实现而设计的。
5> 存储数据的指针,要传给基类,以操作数据。
6> 如果觉得 data[n*n] 会让类变大,可以使用 boost::scoped_array<T> pData 来申请堆上内存。

● 讨论
1> 把size写死到invert里可能会有编译器优化;把size当参数传给invert可以减小目标代码,从而提高执行效率。哪一个更好,这个要都试过才知道。
2> 把invert移到基类,会增大对象的体积。比如上面的例子,至少每个基类要有个指针吧。对指针的生存期的管理又增加了使用复杂度。


● 对type parameter的优化
1> 前面讨论的都是non-type parameter,而如int、long这些所谓的type parameter也可能导致代码膨胀。比如某些平台int和long一样,一些linker却不理会,于是制造出两份,造成了重复。
2> 大多数平台,对于不同类型的指针,其实二进制表示是完全相同的。这也可以用来优化:成员函数使用强类型指针,内部实现使用void无类型指针函数完成工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值