使用模板有什么缺点?如何避免?

转载 2012年03月28日 23:28:05
文章来源:http://group.gimoo.net/review/82612

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

确实这是一个很重要的技术,但是如果不小心,使用模板可能会导致代码膨胀。什么是代码膨胀?请看下面的例子:
1 template <class T, int num>
2 class A
3 {
4 public:
5 void work()
6 {
7 cout < < "work() " < < 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可以进行如下地修改:
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++模板中与参数无关的代码分离出来。

使用模板有什么缺点?如何避免?

http://www.cnblogs.com/royenhome/archive/2010/11/19/1881535.html 文章来源:http://group.gimoo.net/re...

C++模板的缺点以及如何避免

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

MySQL索引缺点&使用详细注意事项

本文转自:点击打开链接 以下主要介绍的是MySQL索引的缺点以及MySQL索引在实际操作中有哪些事项是值得我们大家注意的,我们大家可能不知道过多的对索引进行使用将会造成滥用,有兴趣的...

Msql索引的介绍 优点和缺点和使用过程中要注意的一些事项 挺好的

索引是快速搜索的关键。MySQL索引的建立对于MySQL的高效运行是很重要的。下面介绍几种常见的MySQL索引类型。 在数据库表中,对字段建立索引可以大大提高查询速度。假如我们创建了一个 mytab...

Mybatis 优缺点,配置,使用,结合Spring使用,常见错误,代码自动生成(草稿)

项目需要Mybatis, 配合mybaitis-generator代码自动生成Entity,xml,mapper类,比hibernate轻多了...

使用iframe的优缺点,为什么少用iframe以及iframe和frame的区别。

iframes 提供了一个简单的方式把一个网站的内容嵌入到另一个网站中。但我们需要慎重的使用iframe。iframe的创建比其它包括scripts和css的 DOM 元素的创建慢了 1-2 个数量...

FreeMarker优点和缺点与使用FreeMarker的10个理由

首先给大家简单介绍一下FreeMarker。FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与Web容器无关,即在Web运行时,它并不知道Serv...

简单工厂模式--使用--扩展--缺点--适用情况--

简单工厂模式的一些基本知识 本文主要参见自《Java与模式》 一、UML类图表示如下 二、角色如下 1.Product接口: a.含有具体产品的共有接口。 ...

Unity3D使用经验总结 缺点篇

Unity3D使用经验总结 缺点篇         不论是从官方手册,还是各种第三方教程,几乎涉及到的,都是讲如何使用U3D,以及U3D的优点。         虽然我是用的一个...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用模板有什么缺点?如何避免?
举报原因:
原因补充:

(最多只允许输入30个字)