http://www.cnblogs.com/royenhome/archive/2010/11/19/1881535.html

文章来源:http://group.gimoo.net/review/82612

templates(模板)是节省时间和避免代码重复的极好方法,我们可以只输入一个类模板,就能让编译器实例化所需要的很多个特定类及函数。类模板的成员函数只有被使用时才会被实例化,下面就是work被实例化了4次,所以只有在每一个函数都在实际中被使用时,我们才会得到这些函数。

确实这是一个很重要的技术,但是如果不小心,使用模板可能会导致代码膨胀。什么是代码膨胀?请看下面的例子: 
1      template <class T, int num> 
2      class A 
3      { 
4      public: 
5                void work()

6                { static int i = 0;

7                        cout < < "work() " < <i++<< endl; 
8                        cout < < num < < endl; 
9                } 
10    }; 
11 
12    int main() 
13    { 
14              A <int, 1>v1; 
15              A <int, 2>v2; 
16              A <int, 3>v3; 
17              A <int, 4>v4; 
18              v1.work(); 
19              v2.work(); 
20              v3.work(); 
21              v4.work(); 
22              return 0; 
23    } 
类模板A取得一个类型参数T,并且它还有一个类型为int的参数,一个非类型参数(non-type parameter),与类型参数相比,虽然非类型参数不是很通用,但他们是完全合法的。在本例中,由于num的不同,代码14到17行的调用将会生成了三个A的实例,然后在18~21行又生成了不同的函数调用。 
虽然这些函数做了相同的事情(打印一个“work()”和num),但他们却有不同的二进制代码。这就是所说的由于模板导致的代码膨胀。也就是说,虽然源代码看上去紧凑而整洁,但是目标代码却臃肿而松散,会严重影响程序的运行效率。

如何避免由于这种代码膨胀呢?有一个原则,就是把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> 
2      class Base 
3      { 
4      public: 
5                void work(int num) 
6                { 
7                        cout < < "work "; 
8                        cout < < num < < endl; 
9                } 
10    }; 
11 
12    template <class T, int num> 
13    class Derived : public Base <T> 
14    { 
15    public: 
16              void work() 
17              { 
18                      Base <T>::work(num); 
19              } 
20    }; 
21 
22    int main() 
23    { 
24              Derived <int, 1>d1; 
25              Derived <int, 2>d2; 
26              Derived <int, 3>d3; 
27            
28              d1.work(); 
29              d2.work(); 
30              d3.work(); 
31              return 0; 
32    }

程序中work的参数版本是在一个Base类(基类)中的。与Derived类一样,Base类也是一个类模板,但是与Derived类不一样的是,它参数化的仅仅是类型T,而没有num。因此,所有持有一个给定类型的Derived将共享一个单一的Base类。比如代码24~26行实例化的模板类都共享Base <int>模板类,从而他们的成员函数都共享Base <int>模板类中的work这个单一的拷贝。

模板的缺点:不当地使用模板会导致代码膨胀,即二进制代码臃肿而松散,会严重影响程序的运行效率。

解决方法:把C++模板中与参数无关的代码分离出来。

使用模板有什么缺点?如何避免?相关推荐

  1. 网站建设中 模板_网站建设之模板网站的缺点

    随着网站建设市场的日益成熟,许多的自助建站平台纷纷涌入建站市场,甚至许多主机供应商也与一些自助建站平台达成了战略合作,买服务器赠送模板网站.那么我们进行网站建设时是选择专业建站公司的定制网站还是模板站 ...

  2. 开发缺点_利用模板去建设开发企业网站好不好?模板建站的缺点?

    企业想要利用网站扩大自己的品牌知名度和吸引客户在现在看来已近是很平常的一件事情了,当然还是有很多企业可能是怕浪费时间又或者是不愿意在这方面投入更多的成本,所以就直接选择了几个已有的模板来建设企业网站, ...

  3. OpenCV中使用模板匹配识别空闲的货架空间

    但是点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 假设你是一名在超市工作的员工,被要求在商店里四处走动,检查需要 ...

  4. 16、Python与设计模式--模板模式

    一.股票查询客户端 投资股票是种常见的理财方式,我国股民越来越多,实时查询股票的需求也越来越大.今天,我们通过一个简单的股票查询客户端来认识一种简单的设计模式:模板模式. 根据股票代码来查询股价分为如 ...

  5. 有哪些网站是django开发的_网站模板建设和定制开发哪个好,有哪些区别?

    网站有哪些作用?很多企业主对于网站建设都没有什么概念,也不知道建设网站有哪些好处,小编告诉大家做好企业的网站不仅可以展示企业的信息,让企业在互联网上有更多的信息推广,而且网站也会在搜索引擎有排名,这样 ...

  6. 设计模式(模板模式,命令模式,备忘录模式)

    目录 模板模式 什么是模板模式? 术语? 什么时候使用模板模式? 模板模式的优点? 模板模式的缺点? 角色? 钩子函数? 注意事项和细节? 什么场景使用模板模式? 案例: 命令模式 什么是命令模式? ...

  7. C++ 模板元编程的应用有哪些,意义是什么?

    https://www.cnblogs.com/liangliangh/p/4219879.html 为了谈应用,先谈谈使命.模板元编程的根在模板.模板的使命很简单:为自动代码生成提供方便.提高程序员 ...

  8. 模板匹配综述-SSD,BBS,DDIS,CoTM,QATM

    简单看了几篇模板匹配相关的论文,总结了一下,后期待修改 模板匹配介绍 模板匹配是计算机视觉应用中最常用的技术之一,可以应用在视频跟踪,图像拼接,目标检测,字符识别和3D重建等方向上. 模板和目标图像的 ...

  9. 设计模式:行为型-模板模式

    目录 第一章 模板模式介绍 第二章 模板模式实现 2.1.抽象父类 2.2.具体子类 2.3.测试类 第三章 模板模式应用 项目地址:https://gitee.com/caochenlei/desi ...

最新文章

  1. 离开百度三年多,吴恩达纽交所敲钟,身价再增20亿
  2. java费波拉切_面试题 - 不再犯错 - 博客园
  3. Python科学计算(一)环境简介——Anaconda Python
  4. P4169 [Violet]天使玩偶/SJY摆棋子(CDQ分治、暴力)
  5. Kotlin静态方法定义和调用
  6. Vim配置Java IDE
  7. 有关windows在调试ODOO8.0有些问题
  8. 微信小程序设置字体无效_小程序设置字体样式 微信小程序字体样式
  9. 我的知识管理工具列表 zz
  10. [软件工程] 形式化说明技术
  11. Redis 集合排序
  12. 观察者模式(行为型)
  13. win10触摸板双指单击不能唤出右键菜单
  14. python requests常见用法总结
  15. php 判断是否是机器人,PHP_php实现判断访问来路是否为搜索引擎机器人的方法,本文实例讲述了php实现判断访 - phpStudy...
  16. 攻防世界 Windows_Reverse1
  17. 跳棋游戏利用树构建合法路径出现循环的解决办法
  18. Error !安装Discuz社区论坛没有出现图形化界面
  19. PhpStorm-2017.3
  20. JAVA Leetcode13. 罗马数字转整数

热门文章

  1. Centos 安装Eclipse报错java.lang.UnsatisfiedLinkError: Could not load SWT library
  2. Android 使用Listview的优化
  3. 【推荐系统】基于MovieLens数据集实现的协同过滤算法
  4. 四、分析HelloWorld程序,开始学习Java运算符
  5. 极客产品经理学习笔记
  6. RUN++ | 对比学习加持,多轮对话改写新SOTA!
  7. 几何梯度分析神经网络中不可信预测性
  8. AAAI 2019 | 基于不同颗粒度语言联合训练的表示学习
  9. Nature论文解读:用于改善加权生物网络信噪比的网络增强方法
  10. python将字典导入excel_python将字典列表导出为Excel文件的方法