C++ 函数模板(2)

文章概述

C++编译器是如何提供函数模板的机制? 解决这个问题之前,我们探究一下C++编译器的原理(如何将高级语言转化为计算机能够识别的低级机器指令)


编译器编译原理

我们首先区分以下几个概念:
a. 编辑器: 用来让程序员优雅的敲代码;
常见的编辑器: Sublime,Vim。
b. 编译器: 将高级语言或者汇编语言编译成计算机能够识别的并运行的机器语言;常见的编译器:GCC 编译器。
如果我们每次编辑完源程序都要在命令行依托编译器进行编译岂不是很麻烦,于是集成开发环境出现很快的完善了开发效率的问题。
c. 集成开发环境(IDE): 用于提供程序开发环境的应用程序,一般包括编辑器,编译器,调试器和图形界面工具。集成了代码编写功能,分析功能,编译功能,调试功能等一体化的开发软件服务套。
常见的IDE: Visual Stdio。


我们以GCC编译器为例,探究编译器编译原理:
这里写图片描述
a. 预处理: 将源程序hello.c经过预处理器生成hello.i(被修改的源程序),预处理器只要是宏定义展开;
b. 编译器: 将被修改的源程序hello.i通过编译器生成汇编程序hello.s;
c. 汇编器: 将汇编程序hello.s通过汇编器生成可重定位的目标程序hello.o(二进制);
d. 链接器: 将可重定位的目标程序和程序使用的别的动态库打包成可执行的目标程序。(二进制)
说明: hello.c是一个高级c语言程序,这种形式容易被程序员读懂。为了在系统上运行hello.c程序,每条c语句都必须被转换为低级指令,然后将这些低级指令打包成可执行目标文件格式,并且以二进制形式存储于磁盘中。


函数模板本质

函数模板的本质: 编译器并不是将函数模板处理成能够处理任意类型的函数,而是通过调用函数模板的具体类型产生不同的函数(这也解释了函数模板为什么和普通函数发生函数重载)。编译器会对函数模板进行两次编译: a. 在声明函数模板的地方对模板代码本身进行编译; b. 调用函数模板的地方对参数替换后的代码进行编译。(根据参数的类型产生几个函数)

猜你喜欢

转载自blog.csdn.net/wue1206/article/details/81479528