请问普通函数与内联函数有什么区别?

goodluck10660 2003-03-20 11:27:12
看书看了很长时间,就是不能理解,
让大家见笑了!
...全文
334 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Cypher 2003-03-21
  • 打赏
  • 举报
回复
inline是一种“建议”,告诉编译器最好这样做,但编译器可以根据情况确认是否把函数展开,如函数过于复杂时还是会编译为普通的参数。

在一些实时操作系统中,由于编译器的处理方式上的差异,很多时候用inline也省不了什么操作。Intel平台就不同了,总是调用时先把参数压栈。
shine333 2003-03-21
  • 打赏
  • 举报
回复
一般情况下效果相当于编译器将代码直接拷贝到各个调用它的地方,而不是跑到什么栈里去
brallow 2003-03-21
  • 打赏
  • 举报
回复
这样解释吧,因为C++使用了太多的成员函数这中东西而一些功能是经常要用到的,就用inline关键字申明,这样的函数与一般函数不同之处就在于,在编译是这些函数的主体也就是功能部分直接插入了程序的代码之中,而没有函数调用的堆栈生成、销毁的过程,同时没有了过程调用语句也可以是CPU的执行效率提高。举例来说:
有这样一个函数:
int max(int x,y)
{
if (x>=y)return x else return y;
}
如果在程序的其他地方调用此函数,就回把if (x>=y)return x else return y;编译后的二进制代码插入该处,而不是象一般的插入函数调用的代码。
另外在C++中,在类声明部分定义的函数自动转为内联函数。
woxihuanbohe 2003-03-21
  • 打赏
  • 举报
回复
翻翻MSDN发现,哦,inline是声明一个函数告诉编译器,需要调用这个函数的时候,不用什么堆栈,直接用这段代码代替函数,提高编译效率和速度!

inline Specifier
The inline specifier instructs the compiler to replace function calls with the code of the function body. This substitution is “inline expansion” (sometimes called “inlining”). Inline expansion alleviates the function-call overhead at the potential cost of larger code size.

The inline keyword tells the compiler that inline expansion is preferred. However, the compiler can create a separate instance of the function (instantiate) and create standard calling linkages instead of inserting the code inline. Two cases where this can happen are:

Recursive functions.


Functions that are referred to through a pointer elsewhere in the translation unit.
Note that for a function to be considered as a candidate for inlining, it must use the new-style function definition. Functions that are declared as inline and that are not class member functions have internal linkage unless otherwise specified.
涅槃传说 2003-03-21
  • 打赏
  • 举报
回复
个人观点:“内联函数最大的优点是比一般的函数在程序的运行上效率要高,免去了一般函数在大量调用时的麻烦,另外其结构性和可读性要好一点
skevin 2003-03-21
  • 打赏
  • 举报
回复
简短的,会频繁使用的代码可以声明为inline(但编译器不一定会这样做,要判断的)
有时可以代替宏#define。
C++Primer上有较详细的说明。
zhouzhaohan 2003-03-21
  • 打赏
  • 举报
回复
一点补充,因为inline需要把内容展开,所以每调用一次就展开一次,而不是像普通函数一样只是在调用的时候跳到同一个地址去,调用完了再跳回来。所以这样就导致内存中的代码量加大,这也就是为什么对于比较大的inline函数,编译器一般将其当作一般函数来处理。同时,inline函数由于只是代码的替换,不会导致当前pc指针跳转,所以无需保护现场,局部变量也有其所在的函数来分配,不会无意破坏寄存器的值,所以不需要在栈上保存什么信息,就和一般的代码没什么区别,因此它也不需要一般函数调用的入栈出栈工作。这样的话会节省一些cpu时间,但是有过某些函数调用要使用栈的特性,比如递归的话,那么inline后的函数就做不到了。所以这也体现出了一个时间和空间的trade-off。
macadam 2003-03-21
  • 打赏
  • 举报
回复
普通的函数调用需要建立栈内存环境,进行参数传递,并产生程序执行转移,需要一些时间开销!

内联函数是当编译器看到它的时候,为该内联函数创建一段代码,以后便在每次碰到它调用的时候都用相应的这段代码替换!

内联函数主要是提高程序的运行效率!
tuxw 2003-03-20
  • 打赏
  • 举报
回复
普通函数调用是跳转到函数的入口地址,执行完返回,需要保护现场,空间开销小,时间开销大

内联函数象宏义一样展开(但比宏定义多了语法检查),不需要保护现场,空间开销大,时间开销小

69,373

社区成员

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

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