【C++】模版详解

1、概念

C++模版分两类:函数模版和类模版
1)函数模板的格式

template <class 形参名,class 形参名,......> 返回类型 函数名(参数列表)
{
    函数体
}

例如:

template <class T> void swap(T& a, T& b)
{
	T t = a;
	a = b;
	b = t;
}

2)类模版的格式

template<class  形参名,class 形参名,…>   class 类名
{ ... };

例如:

template<class T> class A
{
public: 
	T a; 
	T b; 
	T add(T &c, T &d);
};

注意:模板的声明或定义只能在全局,命名空间或类范围内进行。即不能在局部范围,函数内进行,比如不能在main函数中声明或定义一个模板。

C++模版概念参见博客:https://blog.csdn.net/qq_52905520/article/details/127455728

2、模版的编译

1)预处理
模版虽然和宏相似,但是模版是在编译阶段处理的,而不是在预处理阶段。
下面是执行预处理的结果:(g++ -E AddDouble.cpp -o AddDouble.i)
在这里插入图片描述
2)编译
模版在不同的源码中,被实例化为相同的类型时,会产生很多重复的代码。
例如在两个源码中使用了模版实例化为相同的类型(int),后编译为汇编代码时(g++ -S),产生的函数标志相同:_Z7addTempIiET_S0_S0_
在这里插入图片描述

3)链接
重复代码消除:模版在不同的源码中,被实例化为相同的类型时,会产生很多重复的代码,C++编译器在链接时,会消除重复的代码。
在这里插入图片描述
查看汇编代码,可以看到 模版函数被标记为 comdat

什么是comdat?
comdat(Common Data Area)是链接器用来处理重复代码和数据的一种机制,它允许链接器在生成最终的可执行文件或库时,合并(或“折叠”)相同的函数和数据定义,以减少最终程序的大小。

comdat 的工作原理:

  • 编译时:当使用编译器编译C++代码时,编译器会识别出可以安全合并的代码和数据(如内联函数、模板实例化等),并将它们放置在带有comdat属性的段中。
  • 链接时:链接器遍历所有输入对象文件(.obj),查找带有comdat属性的段。对于每个comdat段,链接器会检查是否已经有一个相同的段被包含在了最终的程序中。如果是,链接器会丢弃当前遇到的这个段,因为它已经被之前的某个段所代表。这样,相同的代码或数据只会在最终的程序中出现一次。
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郭老二

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值