问题:为什么函数模板可以和函数重载放在一起,c++编译器是如何提供函数模板机制的?
首先需要知道编译器原理:
常用的gcc编译器,可以编译多种语言,具体百度。
将Qt中的g++编译器添加到环境变量中,在cmd中调用g++版本:
先用一个最简单的程序:
#include<iostream> using namespace std; template <typename T> void myswap(T& a, T& b) { T c; c = a; a = b; b = c; cout << "模板调用" << endl; } void main1() { { int x = 10; int y = 20; //myswap<int>(x, y);//显示类型调用 myswap(x, y);//自动类型推导 cout << "x =" << x << "y = " << y << endl; } { char a = 'a'; char b = 'b'; myswap<char>(a, b);//显示类型调用 cout << "a =" << a << "b = " << b << endl; } }
这里只需要知道编译成汇编程序:
在之前已经将编译器加入了环境变量,在找到cpp文件路径后直接用g++编译器编译到汇编文件:
编译成功后查看目录多了一个1.s文件
用vs打开此文件:
可以找到mian函数的起始地点:
通过call可以找到函数调用:
查找函数调用
可以发现第33行调用第96行.
第二个函数调用入口
函数调用:
可以发现第60行调用了第121行。
最后得出结论:在编译过程中,模板函数的不同参数调用下编译后产生了不同的汇编函数。
函数模板的机制是借助g++编译器的优势在编译时通过不同的参数产生了不同的函数!
所以函数模板可以和普通的函数放在一起产生函数重载。
g++编译器是经过两次编译进行构造的。第一次编译在申明出对模板本身进行编译;在调用的地方对参数替换后的代码进行编译。
类模板第一次编译产生一个函数头,第二次编译产生一个函数头,两次编译的函数头不一样会发生找不到函数体的问题。
理解模板的编译过程对后面类模板的搭建有至关重要的作用!