读书笔记《Effective C++》条款44:将与参数无关的代码抽离template

来源:互联网 发布:178软件源地址 编辑:程序博客网 时间:2024/05/29 06:59

Template是节省时间和避免代码重复的一个奇方妙法。不再需要键入20个类似的class而每一个带有15个成员函数,你只需要键入一个class template,留个编译器去具现化那20个你需要的相关class和300个函数。(class template的成员函数只有在被使用时才被暗中具现化,所以只有在这300个函数的每一个被使用,你才会获得这300个函数)Function template有类似的诉求。替换写许多函数,你只需要写一个function template,然后让编译器做剩余的事情。

但有时候,如果一不小心,使用template可能会导致代码膨胀:其二进制码带着重复的代码、数据,或两者。其结果有可能源代码看起来合身而整齐,但目标码却不是那么回事。所以需要知道如何避免这样的二进制浮夸。

当编写某个函数,而其中某些部分的实现代码和另一个函数的实现代码相同,我们会抽出这两个函数的共同部分,把它们放进第三个函数中,然后令原先两个函数调用这个新函数。也就是说,分析了两个函数,找出共同的部分和变化的部分,把共同部分搬到一个新函数去,保留变化的部分在原函数中不动。同样道理,编写某个class,而明白其中某个部分和另一个class的某些部分相同,也不会重复这共同的部分。取而代之的是把共同部分搬移到新class去,然后使用继承或复合,令原先的class取用这共同特性。而原class的互异部分仍然留在原位置不动。

编译template时,也是做相同的分析,以相同的方式避免重复,但其中有个窍门。在non-template代码中,重复十分明确:可以“看”到两个函数或两个class之间有所重复。然而在template代码中,重复是隐晦的:毕竟只有一份template源码,所以必须训练自己去感受template被具现化多次时可能发生的重复。


要点:

1.Template生成多个class和多个函数,所以任何template代码都不该与某个造成膨胀的template参数产生相依关系。

2.因非类型模板参数而造成的代码膨胀,往往可消除,做法是以函数参数或class成员变量替换template参数。

3.因类型参数而造成的代码膨胀,往往可降低,做法是让带有完全相同二进制表述的具现类型共享实现码。

阅读全文
0 0
原创粉丝点击