C++ 内联函数,宏定义函数和普通函数的区别:

这个问题是面试中经常遇到的,再一次华为的面试中面试官就问道我这个问题,当时,答的不是很好,甚至有些错误,特此根据自己的理解,总结一下。本人水平不高,有什么错误,欢迎提出!

     首先,我们都知道C++从源代码到执行经过3个大体的步骤: 1.预处理,这个阶段主要是将宏定义的符号在源程序中进行替换,比图#define pi 3.1415,这个时期就是将源程序中的所有的pi这样的符号替换为3.1415,当然,宏还可以定义函数,称为带参的宏,比如#define MAX(a,b) a>b?a:b,在预处理阶段,将源程序中所有的MAX(a,b),这样的部分到替换为a>b?a:b;(在源程序中的a,b是数字或者是其他的类型数据),可见,带参的宏定义的参数是没有类型的。在预编译阶段还要进行文件插入(将头文件中的内容插入到源文件中),删除注释,条件编译。经过预处理的源代码,我们还是可以阅读的,就像自己写的一样,只是进行了一些小的变动。(这一部分基本上说的是宏定义的知识点)。

如果还想深入了解预编译阶段:http://www.360doc.com/content/18/0102/10/50906870_718321766.shtml

       其次,就是编译阶段,编译阶段主要是词法分析,语法分析这之类的工作,这个阶段就是将经过预处理的文件,最终变成二进制文件的过程,这个阶段在大多数的编译器中,都会将源程序中对inline函数的每一次调用,都以函数的本体来替换,也就像宏定义一样,这样就会增加目标代码的大小,一台内存有限的机器上过度使用inline会造成程序体积太大,即使拥有虚内存,这样也会导致换页行为,这样会带来效率损失。inline这样的替换工作,就将一个普通函数的传参,压栈,返回值这些操作都没有了,因为替换之后,我们在函数调用处的都是代码展开,就像执行一般语句一样。可见,inline与带参的宏的不同就是处理的时间不一样,一个的参数是有类型的,一个的是没有类型的。inline与普通的函数的不同便是,普通函数是有保存现场,传参,执行,返回值,恢复现场,这些开销,而inline是没有的,但是inline函数的做法就是典型的空间换时间,所以,一般将小的常用的函数申明为inline。还有一点,带参的define是简单的符号替换的话,就要慎重地考虑有括号和没有括号的情况了,比如

    

我推荐一个写的更好的,讲解更详细的博客:

https://www.cnblogs.com/ht-927/p/4726570.html

猜你喜欢

转载自blog.csdn.net/daydayup_666/article/details/79926030