zoukankan      html  css  js  c++  java
  • 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++编译器是经过两次编译进行构造的。第一次编译在申明出对模板本身进行编译;在调用的地方对参数替换后的代码进行编译。

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

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

  • 相关阅读:
    javaSE第二十四天
    javaSE第二十三天
    javaSE第二十二天
    javaSE第二十一天
    javaSE第二十天
    javaSE第十九天
    python020 Python3 OS 文件/目录方法
    python019 Python3 File(文件) 方法
    python018 Python3 输入和输出
    python017 Python3 模块
  • 原文地址:https://www.cnblogs.com/ymj11/p/13726919.html
Copyright © 2011-2022 走看看