我不太明白所谓内联函数!烦请各位大虾帮一下忙!!

gigi_csdn 2003-05-04 08:42:31
从软件工程的角度来看,用一组函数编写程序是一种好方法。但是,函数调用(特别是小型函数的调用)牵涉到执行调用时的时间开销。为了避免函数调用,在定义函数时,把限定符inline放在函数返回类型之前可使编译器把产生函数代码的拷贝插入到合适的位置上。
-----------------------------------------
函数调用是怎么回事?和内联是什么区别?


内联函数优于预处理程序的宏。优点之一是内联函数就像其它c++函数一样。
------------------------------------------------
宏又是什么概念?为什么说像其它c++函数一样,是个优点??
...全文
63 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
boy21cnthp 2003-05-05
  • 打赏
  • 举报
回复
共同学习
mercury1231 2003-05-05
  • 打赏
  • 举报
回复
具体的在内部代码格式上,内联函数有没有特别呢?
loveonce 2003-05-04
  • 打赏
  • 举报
回复
楼上说的已经很全面了,我就不再说了.
接点分吧!
Wenxy1 2003-05-04
  • 打赏
  • 举报
回复
xiaoK说得对。
分享大哥 2003-05-04
  • 打赏
  • 举报
回复
内联函数主要解决程序运行效率的。不能含有复杂的控制语句,如switch和while
如果内联函数有这些语句,则编译将该函数视同普通函数那样产生函数调用代码。
还有,就是递归函数是不能被用来做内联函数的。
其他的楼上的都说的很好了 !
jinzita177 2003-05-04
  • 打赏
  • 举报
回复
共同学习嘛,给不给分就无所谓了,不过你要给我还是要的!!嗬嗬~~~
jinzita177 2003-05-04
  • 打赏
  • 举报
回复
看看这篇文章吧
严正声明:转载纯属帮忙,还请作者不要介意!
介绍内联函数之前,有必要介绍一下预处理宏。内联函数的功能和预处理宏的功能相似。相信大家都用过预处理宏,我们会经常定义一些宏,如

#define TABLE_COMP(x) ((x)>0?(x):0)
 
就定义了一个宏。

  为什么要使用宏呢?因为函数的调用必须要将程序执行的顺序转移到函数所存放在内存中的某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去执行前要保存现场并记忆执行的地址,转回后要恢复现场,并按原来保存地址继续执行。因此,函数调用要有一定的时间和空间方面的开销,于是将影响其效率。而宏只是在预处理的地方把代码展开,不需要额外的空间和时间方面的开销,所以调用一个宏比调用一个函数更有效率。

  但是宏也有很多的不尽人意的地方。

  1、.宏不能访问对象的私有成员。

  2、.宏的定义很容易产生二意性。

  我们举个例子:

#define TABLE_MULTI(x) (x*x)

  我们用一个数字去调用它,TABLE_MULTI(10),这样看上去没有什么错误,结果返回100,是正确的,但是如果我们用TABLE_MULTI(10+10)去调用的话,我们期望的结果是400,而宏的调用结果是(10+10*10+10),结果是120,这显然不是我们要得到的结果。避免这些错误的方法,一是给宏的参数都加上括号。

#define TABLE_MULTI(x) ((x)*(x))

  这样可以确保不会出错,但是,即使使用了这种定义,这个宏依然有可能出错,例如使用TABLE_MULTI(a++)调用它,他们本意是希望得到(a+1)*(a+1)的结果,而实际上呢?我们可以看看宏的展开结果: (a++)*(a++),如果a的值是4,我们得到的结果是5*6=30。而我们期望的结果是5*5=25,这又出现了问题。事实上,在一些C的库函数中也有这些问题。例如: Toupper(*pChar++)就会对pChar执行两次++操作,因为Toupper实际上也是一个宏。

  我们可以看到宏有一些难以避免的问题,怎么解决呢?

  下面就是用我要介绍的内联函数来解决这些问题,我们可以使用内联函数来取代宏的定义。而且事实上我们可以用内联函数完全取代预处理宏。

  内联函数和宏的区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。你可以象调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。

  我们可以用Inline来定义内联函数,不过,任何在类的说明部分定义的函数都会被自动的认为是内联函数。

  下面我们来介绍一下内联函数的用法。

  内联函数必须是和函数体申明在一起,才有效。像这样的申明Inline Tablefunction(int I)是没有效果的,编译器只是把函数作为普通的函数申明,我们必须定义函数体。

Inline tablefunction(int I) {return I*I};

  这样我们才算定义了一个内联函数。我们可以把它作为一般的函数一样调用。但是执行速度确比一般函数的执行速度要快。

  我们也可以将定义在类的外部的函数定义为内联函数,比如:

Class TableClass{
 Private:
  Int I,j;
 Public:
  Int add() { return I+j;};
  Inline int dec() { return I-j;}
  Int GetNum();
}
inline int tableclass::GetNum(){
return I;
}

  上面申明的三个函数都是内联函数。在C++中,在类的内部定义了函数体的函数,被默认为是内联函数。而不管你是否有inline关键字。

  内联函数在C++类中,应用最广的,应该是用来定义存取函数。我们定义的类中一般会把数据成员定义成私有的或者保护的,这样,外界就不能直接读写我们类成员的数据了。对于私有或者保护成员的读写就必须使用成员接口函数来进行。如果我们把这些读写成员函数定义成内联函数的话,将会获得比较好的效率。

Class sample{
 Private:
  Int nTest;
 Public:
  Int readtest(){ return nTest;}
 Void settest(int I) {nTest=I;}
}

  当然,内联函数也有一定的局限性。就是函数中的执行代码不能太多了,如果,内联函数的函数体过大,一般的编译器会放弃内联方式,而采用普通的方式调用函数。这样,内联函数就和普通函数执行效率一样了。
weiziyuner 2003-05-04
  • 打赏
  • 举报
回复
内联关键字inline只是建议编译器将代码在调用该函数的时候展开,但编译器是否会这样作取决于编译器,c++standard并没有强制规定说一定要展开(所谓展开就是说在调用的时候不要进行压栈和返回时的出栈的操作,而是将代码直接在这里copy一下,因此这样会使代码量增加,但可以提高效力)
这个问题具体的可以看<thinking in c++>(中文版<c++编程思想>,最好看英文版)
zhoory 2003-05-04
  • 打赏
  • 举报
回复
从C++的编译器的角度看,内联函数是在编译的初使阶段,即:生成.exe之前,静态的联入程序内部,当然会引起程序的长度增加,但是免去了函数调用的保存现场(压栈……)时间消耗,在一定的程度上会节约时间。
Wenxy1 2003-05-04
  • 打赏
  • 举报
回复
//程序在处理函数调用时会采取什么样的方法?
1.保存现场
2.转到被调用的函数体执行
3.被调用的函数体执行完毕,回到断点处继续执行.

在实现的技术上常用出入栈法.
lifanxi 2003-05-04
  • 打赏
  • 举报
回复
>内联函数的缺点:增加了可执行代码的长度。
注意这个缺点是针对普通函数而言,不是针对宏来说的。内联函数和宏的多次展开都会引起代码的变长。
还要注意inline只是建议编译器对函数内联,写在类里的也一样,究竟是否内联将由编译器决定,因为不是任何函数都是可以内联的。
gigi_csdn 2003-05-04
  • 打赏
  • 举报
回复
程序在处理函数调用时会采取什么样的方法?
zhumerchant 2003-05-04
  • 打赏
  • 举报
回复
内联函数的缺点:增加了可执行代码的长度。
宏的缺点:容易产生歧义。
Wenxy1 2003-05-04
  • 打赏
  • 举报
回复
宏一般放在头文件里,对程序的可移植性有着较好的帮助。
内联函数一般只有几行代码,但增加了空间。
另外,在C++里,在类里实现的函数,即使没有 inline 修饰,编译时也作为内联函数处理。
lifanxi 2003-05-04
  • 打赏
  • 举报
回复
函数调用会涉及到保护现场,传参,跳转,返回,恢复现场等操作,比较费时。
用了内联后,函数会在调用位置进行展开,避免了运行成本。
宏就是#define 的成果如:
#define Max(x,y) (((x)>(y))?(x):(y))
就是定义了一个宏。
这样程序中就可以用Max宏来获取两个值中的较大值了。
宏也是在预编译时展开的,内联函数是在编译时展开的,内联函数是类型安全的,所以内联函数比宏要好,是个优点。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧