c++编译器模板机制剖析

问题:为什么函数模板可以和函数重载放在一起,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++编译器是经过两次编译进行构造的。第一次编译在申明出对模板本身进行编译;在调用的地方对参数替换后的代码进行编译。

类模板第一次编译产生一个函数头,第二次编译产生一个函数头,两次编译的函数头不一样会发生找不到函数体的问题。

理解模板的编译过程对后面类模板的搭建有至关重要的作用!

 

posted on 2020-09-24 21:53  龑覭  阅读(334)  评论(0编辑  收藏  举报