02模板学习之函数模板的编译原理

02模板学习之函数模板的编译原理

可能下面不太好理解,建议可以参考【C++】模板(template)进阶,这篇内容的介绍好理解很多,个人也觉得比本篇容易理解。

1 函数模板编译的次数
编译器会对函数模板进行两次编译,在声明函数模板地方编译一次,在调用的地方再编译一次。
注:该结论是固定的,记住即可。

2 函数模板第一次编译后再被调用确定类型后,第二次编译如何生成函数
当函数模板声明后(声明即第一次编译)被调用时,出现不同的调用方式时(例如形参不同),编译器将模板生编译成多个函数(调用即第二次编译);若同样的调用方式,则不生成重复的函数,复用已经生成的函数。

代码例子讲解:

//声明后会进行第一次编译
template<class T> 
int MyAdd(T a, T b){
	return a+b;
}

int main(){

	//此时编译器第二次编译会生成一个MyAdd(int int)的函数
	int a=1;
	int b=2;
	MyAdd(a,b);

	//此时编译器第二次编译会生成一个MyAdd(double double)的函数
	double  c=1.1;
	double  d=2.2;
	MyAdd(c,d);

	//再次调用,不会再生成,只会复用上面已经生成的函数
	MyAdd(a,b);	

	return 0;
}

下面我们可以通过gcc的-S命令来查看:
首先了解一下gcc当地这两个选项先。

-S:执行到编译阶段停止。生成的后缀名默认为.s,会经历之前的阶段。
//注意与-c区别
-c:不执行前面的阶段,只在编译阶段编译并且在汇编阶段生成目标文件后跳过汇编和链接。生成的后缀默认为.o。所以很多人短说:只编译不汇编链接(但会在汇编阶段生成目标文件)

g++或者gcc编译生成编译阶段的.s文件,因为.o根本无法看,都是二进制了,所以这里使用编译时的文件分析。
在这里插入图片描述
先找到main函数,然后再找到call,意思是代表调用的意思,然后对比发现,三个call中有两个函数名是一样的,所以模板在第二次编译时只生成了两个函数。
在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
函数模板C++中的一种特殊函数,它可以根据不同的参数类型,生成不同的函数实例。其原理是在编译时,根据函数模板中的参数类型,生成对应的函数代码,然后将其编译成可执行代码。当程序调用函数模板时,编译根据实际传入的参数类型,选择合适的函数实例进行调用。 函数模板的定义一般以关键字 `template` 开始,后面跟着函数的定义,其中函数的参数可以是模板参数,用 `typename` 或 `class` 关键字来声明,如下所示: ``` template<typename T> void swap(T &a, T &b) { T temp = a; a = b; b = temp; } ``` 在上面的代码中,`T` 是一个模板参数,表示函数模板可以接受任意类型的参数。在函数实现中,我们使用 `T` 来声明变量和参数,这样就可以实现对不同类型数据的交换操作。 在调用函数模板时,我们可以显式地指定模板参数的类型,也可以让编译器自动推导出模板参数的类型,如下所示: ``` int a = 1, b = 2; swap<int>(a, b); // 显式指定模板参数类型 ``` 在上面的代码中,我们显式地指定了模板参数类型为 `int`,这样编译器就生成一个针对 `int` 类型的函数实例。我们也可以不指定模板参数类型,让编译器根据实际参数类型自动推导出模板参数类型,如下所示: ``` double c = 1.1, d = 2.2; swap(c, d); // 自动推导模板参数类型为 double ``` 在上面的代码中,编译自动推导出模板参数类型为 `double`,然后生成一个针对 `double` 类型的函数实例。 总之,函数模板的原理是根据不同的模板参数类型生成不同的函数实例,在程序编译时进行类型检查和函数匹配,以生成可执行代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值