本文作者:Closeall
本文出处:http://blog.youkuaiyun.com/closeall2008
声明: 本文可以不经作者同意, 任意复制, 转载, 但任何对本文的引用都请保留文章的作者, 出处以及声明信息. 谢谢.
我们知道c++通过内联函数对c语言进行了扩充,从而在某种程度上对程序的运行效率进行改
进。然而普通函数与内联函数的区别不在于它们的编写方式上,而在于c++编译器对它们的理解、
解释。要想对内联函数有比较深入的理解,我们必须深入到函数的内部。
我们知道代码经过编译器进行编译后,把我们写的程序语句翻译成了机器可以识别的机器指令,然
后进行连接,从而生成可执行程序。当程序运行时,系统把机器指令调入内存,因而每条指令都有
地址。机器就按照你的程序的逻辑顺序执行这些机器指令,但并不是每条指令都会运行,有的指令
会被跳过去的,如:if语句中的一些指令。所以指令的执行并不是顺序的,存在着一些跳转。那么普
通的函数是怎么来运行的呢?下面我来分析:当程序运行到调用函数的指令得时候,把调用指令的
地址纪录下来,然后通过函数的地址(任何一条指令都会有一个内存地址,当然函数也不例外的)
会跳到函数本身定义时的指令处,把传递给函数的实际参数复制后传给函数得形参放入堆栈,然后
执行函数内部的指令。函数的内部指令执行完毕后,根据调用函数的那个指令的地址,返回到原来
地方,从而继续执行下面的指令。因为执行普通函数调用的时候存在着记录地址、跳转等操作,所
以存在着一些额外的开销。而内联函数使用另外的机制,它不用于普通函数的调用。当指令执行到
内联函数的时候,并不进行记录地址和跳转的操作,而相当于把内联函数内部的指令拷贝在调用的
地方,而顺序的执行下去。这样内联函数不存在跳转,因而执行时速度会比普通函数的调用稍快一
些的,但是它会占用更多的内存,调用内联函数的次数越多,所占用的内存就会越大,因为每一个
存在内联函数调用的地方,都相当于对内联函数进行了一次拷贝。如果有10个内联函数得调用,程
序中就存在10个内联函数的拷贝,有100个调用就有100个拷贝。所以一般对小型的函数才使用内联
函数。还有一点是,如果函数体本身执行的时间比较长,而使用内联函数所节省的那点时间对于这
个时间来说很少,在这个时候不要使用内联函数,毕竟函数体过大,会占用很多的内存空间的。还
有一些内容是比较容易忽视的,下面我来说几点:首先,编译器并不会把你所定义的每一个内联函
数在编译的时候都看成是内联函数的,这要根据的编译器而定,在编译的时候编译器会检查你所定
义的内联函数是不是符合要求,或者是说存在其他的一些别的原因,编译器会视情况而定。其次,
内联函数是不允递归的,这一点一定要记住的。以上两点,很多的书籍上都不会提起到,这是需要
读者注意的地方。
那么内联函数在什么地方定义呢?定义内联函数一个比较习惯性的做法是在头文件中定义。还有就是,
内联函数一般不用声明的,它在头文件中直接定义内联函数,相当于声明
和定义同时进行了,我们知道这样做是允许的,因为它是在头文件中,但是我们不要在头文件中定
义处内联函数之外的其他任何函数。
对于具体如何定义内联函数,我也不想多说的,只需在函数前加上inline 就行了,因为具体的定义
做起来很简单的,在任何一个基础性的书上都会有这方面的介绍说明。其实对于内联函数还有其
他的一些内容,我在这里就不多说了。