对内联函数与普通函数的一些比较与分析

本文出处:http://blog.csdn.net/closeall2008
声明: 本文可以不经作者同意, 任意复制, 转载, 但任何对本文的引用都请保留文章的作者, 出处以及声明信息. 谢谢.     

   我们知道c++通过内联函数对c语言进行了扩充,从而在某种程度上对程序的运行效率进行改

进。然而普通函数与内联函数的区别不在于它们的编写方式上,而在于c++编译器对它们的理解、

解释。要想对内联函数有比较深入的理解,我们必须深入到函数的内部。

我们知道代码经过编译器进行编译后,把我们写的程序语句翻译成了机器可以识别的机器指令,然

后进行连接,从而生成可执行程序。当程序运行时,系统把机器指令调入内存,因而每条指令都有

地址。机器就按照你的程序的逻辑顺序执行这些机器指令,但并不是每条指令都会运行,有的指令

会被跳过去的,如:if语句中的一些指令。所以指令的执行并不是顺序的,存在着一些跳转。那么普

通的函数是怎么来运行的呢?下面我来分析:当程序运行到调用函数的指令得时候,把调用指令的

地址纪录下来,然后通过函数的地址(任何一条指令都会有一个内存地址,当然函数也不例外的)

会跳到函数本身定义时的指令处,把传递给函数的实际参数复制后传给函数得形参放入堆栈,然后

执行函数内部的指令。函数的内部指令执行完毕后,根据调用函数的那个指令的地址,返回到原来

地方,从而继续执行下面的指令。因为执行普通函数调用的时候存在着记录地址、跳转等操作,所

以存在着一些额外的开销。而内联函数使用另外的机制,它不用于普通函数的调用。当指令执行到

内联函数的时候,并不进行记录地址和跳转的操作,而相当于把内联函数内部的指令拷贝在调用的

地方,而顺序的执行下去。这样内联函数不存在跳转,因而执行时速度会比普通函数的调用稍快一

些的,但是它会占用更多的内存,调用内联函数的次数越多,所占用的内存就会越大,因为每一个

存在内联函数调用的地方,都相当于对内联函数进行了一次拷贝。如果有10个内联函数得调用,程

序中就存在10个内联函数的拷贝,有100个调用就有100个拷贝。所以一般对小型的函数才使用内联

函数。还有一点是,如果函数体本身执行的时间比较长,而使用内联函数所节省的那点时间对于这

个时间来说很少,在这个时候不要使用内联函数,毕竟函数体过大,会占用很多的内存空间的。还

有一些内容是比较容易忽视的,下面我来说几点:首先,编译器并不会把你所定义的每一个内联函

数在编译的时候都看成是内联函数的,这要根据的编译器而定,在编译的时候编译器会检查你所定

义的内联函数是不是符合要求,或者是说存在其他的一些别的原因,编译器会视情况而定。其次,

内联函数是不允递归的,这一点一定要记住的。以上两点,很多的书籍上都不会提起到,这是需要

读者注意的地方。

那么内联函数在什么地方定义呢?定义内联函数一个比较习惯性的做法是在头文件中定义。还有就是,

内联函数一般不用声明的,它在头文件中直接定义内联函数,相当于声明

和定义同时进行了,我们知道这样做是允许的,因为它是在头文件中,但是我们不要在头文件中定

义处内联函数之外的其他任何函数。

对于具体如何定义内联函数,我也不想多说的,只需在函数前加上inline 就行了,因为具体的定义

做起来很简单的,在任何一个基础性的书上都会有这方面的介绍说明。其实对于内联函数还有其

他的一些内容,我在这里就不多说了。

 

MSN: closeall@hotmail.com

E_mail & GTalk : closeallster@gmail.com
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值