注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

逍遥子 曰:

得失失得 何必患得患失 舍得得舍 不妨不舍不得

 
 
 

日志

 
 

模板的编译模式 [转]  

2012-06-20 21:28:58|  分类: C/C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
1.函数模版的编译模式分两种:完全包含编译模式和局部编译模式(需要用export关键字)
2.不同的编译器对这两种编译模式的支持各不相同,但一般都支持完全包含编译模式,具体支持情况需要参照具体使用的编译器文档

模版函数和普通函数在使用的时候有一定的区别:
        (1)普通函数在使用的源文件中直接include该函数的声明即可
        (2)模版函数在使用的源文件中既要include模版函数的声明,也要include模版函数的定义(因为只有在编译的时候,根据模版函数的定义进行实例化后生成的函数才是真正的函数定义)


/////举例说明完全包含编译模式:
(1)test.h中在声明的后面include   "test.cpp ",这样做的目的是把sum的声明和定义放在两个文件中
(2)first.cpp和second.cpp中都用到了sum函数模版,所以都要include   "test.h ",所以在两个cpp文件中都有一份sum的定义,所以在实例化以后,存在两个相同的函数定义:int   sum(int   a,int   b){return  a+b;}
(3)对于这种重复定义的问题,完全包含编译模式下,编译器自己会去除冗余的函数定义,而只保留一个int  sum(int   a,int   b)函数的定义
(4)所以这种编译模式下,编译效率会降低(因为如果100的cpp文件中都调用了sum(2,3),那么会存在100个int   sum(int   a,int   b)函数的定义,去除其余99个冗余定义的操作会占用大量的编译时间)


test.h头文件的内容:
template <typename   Type>
Type   sum(Type   a,Type   b);//函数模版的声明

#include   "test.cpp "

test.cpp文件的内容:
template <typename   Type>
Type   sum(Type   a,Type   b)
{
        return   a+b;
}//函数模版的定义

first.cpp文件的内容:
#include   "test.h "
int   main()
{
        sum(2,3);
        return   0;
}

second.cpp文件的内容:
#include   "test.h "
int   second()
{
        sum(2,3);
        return   0;
}


所以为了避免完全编译模式的这种低效率,出现了局部编译模式


///////举例说明局部编译模式
(1)test.h头文件中不需要再include   "test.cpp "
(2)需要使用sum的cpp文件中只需要include   "test.h "即可
(3)在实例化sum函数时,编译器会自动跟踪到sum函数模版的定义(通过export关键字)
(4)这样就提高了编译速度

test.h头文件的内容:
template <typename   Type>
Type   sum(Type   a,Type   b);//函数模版的声明

//#include   "test.cpp "//不需要包含sum函数的定义

test.cpp文件的内容:
export   template <typename   Type> //前面加上export关键字
Type   sum(Type   a,Type   b)
{
        return   a+b;
}//函数模版的定义

first.cpp文件的内容:
#include   "test.h "
int   main()
{
        sum(2,3);
        return   0;
}

second.cpp文件的内容:
#include   "test.h "
int   second()
{
        sum(2,3);
        return   0;
}


综上所述:export关键字只有在使用局部编译模式时才会用到,同时需要编译器支持局部编译模式,如果编译器不支持这种编译模式,那么不能使用export
  评论这张
 
阅读(639)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018