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

831 篇文章 15 订阅
51 篇文章 1 订阅

    templates(模板)是节省时间和避免代码重复的极好方法,我们可以只输入一个类模板,就能让编译器实例化所需要的很多个特定类及函数。类模板的成员函数只有被使用时才会被实例化,所以只有在每一个函数都在实际中被使用时,我们才会得到这些函数。 确实这是一个很重要的技术,但是如果不小心,使用模板可能会导致代码膨胀。什么是代码膨胀?请看下面的例子: 


 

  1. template
  2.       class A
  3.       {
  4.      public:
  5.                 void work()
  6.                {
  7.                       cout < < "work() " < < endl;
  8.                         cout < < num < < endl;
  9.                 }
  10.     };
  11.   int main()
  12.     {
  13.              A v1;
  14.              A v2;
  15.              A v3;
  16.               A v4;
  17.               v1.work();
  18.              v2.work();
  19.              v3.work();
  20.              v4.work();
  21.              return 0;
  22.    }
  23. 复制代码

 

       类模板A取得一个类型参数T,并且它还有一个类型为int的参数,一个非类型参数(non-type parameter),与类型参数相比,虽然非类型参数不是很通用,但他们是完全合法的。在本例中,由于num的不同,代码14到17行的调用将会生成了三个A的实例,然后在18~21行又生成了不同的函数调用。
  虽然这些函数做了相同的事情(打印一个“work()”和num),但他们却有不同的二进制代码。这就是所说的由于模板导致的代码膨胀。也就是说,虽然源代码看上去紧凑而整洁,但是目标代码却臃肿而松散,会严重影响程序的运行效率。
  如何避免由于这种代码膨胀呢?有一个原则,就是把C++模板中与参数无关的代码分离出来。也就是让与参数无关的代码只有一份拷贝。对类模板A可以进行如下地修改:

  1. template
  2.       class Base
  3.       {
  4.      public:
  5.                void work(int num)
  6.                {
  7.                         cout < < "work ";
  8.                         cout < < num < < endl;
  9.                 }
  10.     };
  11.     template
  12.     class Derived : public Base
  13.     {
  14.    public:
  15.              void work()
  16.              {
  17.                       Base ::work(num);
  18.              }
  19.     };
  20.     int main()
  21.     {
  22.              Derived d1;
  23.              Derived d2;
  24.               Derived d3;
  25.            
  26.              d1.work();
  27.              d2.work();
  28.               d3.work();
  29.               return 0;
  30.     }
复制代码

  程序中work的参数版本是在一个Base类(基类)中的。与Derived类一样,Base类也是一个类模板,但是与Derived类不一样的是,它参数化的仅仅是类型T,而没有num。因此,所有持有一个给定类型的Derived将共享一个单一的Base类。比如代码24~26行实例化的模板类都共享Base 模板类,从而他们的成员函数都共享Base 模板类中的work这个单一的拷贝。
  模板的缺点:不当地使用模板会导致代码膨胀,即二进制代码臃肿而松散,会严重影响程序的运行效率。
  解决方法:把C++模板中与参数无关的代码分离出来。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值