关于内联函数调用问题!纯技术问题!欢迎!

onethousand 2003-08-24 02:51:24
我们都知道在主函数中调用子函数的过程,有一些额外开销。
但PRIMER上说,内联函数就没有这方面开销!为什么呢?内联函数的调用机制是怎样的呢?
...全文
121 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
luxinder 2003-08-25
  • 打赏
  • 举报
回复
在函数调用时候要进行参数的赋值和上下文的切换都可能影响到程序所需的内存和
性能,
如double tax(double gross)
{ return gross*0.05;}
当客户代码调用此函数是,客户函数的上下文(即客户函数的参数和包括局部数组
在内的变量)将会保存到栈中。函数调用结束在恢复。
而一个函数成为内联后,则对该函数的调用都被替换称函数中定义的各个语句。没
调用的开销,也不使用栈了。但其可能增加可执行程序的大小,因此可能导致额外的
交换从而降低执行速度
onethousand 2003-08-25
  • 打赏
  • 举报
回复
各位,是不是这样呢
就象我上面说的,执行子函数时与执行内联一样都要暂停主函数的执行,但是执行子函数前要
保存当前状态,返回地址,实参,然后清除原有状态(内存中)来执行子函数;而执行内联时,就没有上面操作呢
airtraffic 2003-08-24
  • 打赏
  • 举报
回复
内联函数就是程序流程执行到此函数的时候,不挂起,而直接在内联函数处展开:
inline int min(int a, int b)
{
return a < b ? a : b ;
}

那么在函数中调用到min()函数的时候,
int main()
{
//....
//int i
i = min(a, b);
//......
}
就在min()函数处直接展开为:
i = a < b ? a : b ;
这样就少了拷贝形参,调用函数的开销,但是内联函数只是适用那些比较短的函数!

讨论!

Beover1984 2003-08-24
  • 打赏
  • 举报
回复
内联是在编译阶段用源程序替代调用,但内联是一种请求,不是一种保证,也就是说不没个inline函数会被真的内联,这要看编译器了。
onethousand 2003-08-24
  • 打赏
  • 举报
回复
除了汇编不大懂外,大家说的我都懂了;
主要是我还没弄懂 主函数是按流程执行的,到子函数时,把主函数放在一边,执行子函数;
但执行到内联时,内联也和主函数无关,就是说把主函数流程断了,相当于放在一边,后执行内联啊!
就是这我觉得没区别啊
loveghb 2003-08-24
  • 打赏
  • 举报
回复
内联就是把一部分要经常用到的小功能写成一个函数,和普通的函数相比,它无需寄存器的保护,参数的出、入栈。所以能提高速度。相当于宏,但是有类型检查,更安全。但是在扩展过程中如果遇到过多的可以省去的中间变量的话,特别是类的变量,就会变的特别大。
具体的还是自己看看《INSIDE THE C++ OBJECT MODEL》吧。
或者自己看看反汇编的代码吧。
tonybaobao 2003-08-24
  • 打赏
  • 举报
回复
我想应该是在函数被反复调用才会比较明显感觉到吧!内联函数就地展开,就像宏一样,所以快?
davidwoo 2003-08-24
  • 打赏
  • 举报
回复
内联函数是要编译器,将函数体

直接插到调用处.而不用在内存中

创建堆栈,因此节省了资源.
madmars 2003-08-24
  • 打赏
  • 举报
回复
如果学习了汇编,你会对这方面的东西很了解
运行一个函数的话会执行指令的条转,cpu寄存器的内容会被修改,代码段指针会被修改
然后需要一些实参的压入堆栈的操作,最后函数执行完毕,要进行指令条转返回
另外如果你学习了微机原理你就会知道为了调用函数,也就是指令条转还会重置cpu的指令
队列,这样也将影响效率
,但是如果用inline 这个函数就会被像宏一样展开,只不过比宏多了的类型安全测试
这样的话就没有了额外的函数调用开销
vcforever 2003-08-24
  • 打赏
  • 举报
回复
在程序调用内联函数的时候,
只是将内联函数中的代码简单
的复制到调用处,以提高效率!
定义内联函数时注意,内联函数的函数体一定要小,
不要在内联函数中写过多的代码!
ehhl 2003-08-24
  • 打赏
  • 举报
回复
恩,内联函数就相当与把代码直接嵌入在代码里面,没有去调用函数所需的开销
也就是说,和C里的宏差不多,在调用的时候只是把宏(内联函数)去代替,因此没有
函数调用的开销。但是过多的内联会使程序过分臃肿,因此一般只把那些很小的函数做成
内联函数。
ehhl 2003-08-24
  • 打赏
  • 举报
回复
恩,内联函数就相当与把代码直接嵌入在代码里面,没有去调用函数所需的开销
也就是说,和C里的宏差不多,在调用的时候只是把宏(内联函数)去代替,因此没有
函数调用的开销。但是过多的内联会使程序过分臃肿,因此一般只把那些很小的函数做成
内联函数。
wbh0360 2003-08-24
  • 打赏
  • 举报
回复
调用函数有参数压栈等巨大开销,记不太清楚了。
dddd8888 2003-08-24
  • 打赏
  • 举报
回复
内联函数就相当与把代码直接嵌入在代码里面,没有去调用函数所需的开销
以空间换时间

69,335

社区成员

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

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