关于内联函数的问题

绿皮车 2003-05-02 08:18:06
大家好:
在学习过程中,我始终对inline函数不太明白,它如何减少系统开销?比如下面的例子中inline 我就觉得多余,可钱大师说这是个技巧,请高手点睛,谢谢!
Ex.
Rmb operator +(Rmb & s,double d)
{
unsigned int y=s.yuan+d;
unsigned int j=s.jf+(d-(int)d)*100+0.5;
Rmb result(y,j);
}
inline Rmb operator +(double d,Rmb &s)
//又调用了一次上面的+,还能省去不必要的开销??
{
return s+d;
}
...全文
22 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
绿皮车 2003-05-03
  • 打赏
  • 举报
回复
各位高人,我仍不明白内联的意义,是不是说内联其实是在编译时讲内联的函数体直接替换到调用函数的调用位置,使它看上去好像没有调用函数一样?但即便是这样,在内联函数中还是要调用Operator +的重载,这如何避免函数调用和一般函数传参?而且我非常想知道,内联函数是如何在内存中运作的?
Dread Heart的问题,我觉得不会,局部变量是在栈中完成的,只要安全的就行。
Tommy 2003-05-03
  • 打赏
  • 举报
回复
这个技巧应该是指使用和上面Rmb operator +(Rmb & s,double d)一样的开销(一次函数调用),而又避免了写重复的代码。

你想,如果不是这样写的话,还有两种做法:1是不用inline,将Rmb operator +(Rmb & s,double d)再写一次,只不过将两个参数的位置换一下。2是不用inline,调用上面的Rmb operator +(Rmb & s,double d)。

解法1中,只有一次函数调用,但是多了冗余代码。解法2中,有两次函数调用。因此,书上的做法只用了一次函数调用,又避免了冗余代码,所以算是一种技巧
kahn 2003-05-03
  • 打赏
  • 举报
回复
这两个函数不是同一个函数,只是两个同名的重载,而inline适用于短小且经常需要调用的函数,编译器不是记录程序的地址,而是将程序的源代码复制到调用处,以此提高效率
caochao 2003-05-03
  • 打赏
  • 举报
回复
做小的程序的时候当然是看不出inline得作用,当作大的程序时候,在一些小的代码少方法中使用inline,可以使程序运行效率上升。
luohualiushui 2003-05-02
  • 打赏
  • 举报
回复
上面的代码一点问题,但不妨碍理解它的意思
第一个运算符重载是RAM+double的情况下调用
第二个是在double+RAM的情况调用
第二个用了inline,则在double+RAM的情况下直接调用RAM+double,避免了一般函数的传参,返回等开销
EnjoySun 2003-05-02
  • 打赏
  • 举报
回复
内联的意义就相当于直接把折断代码插入程序中,避免了函数调用的开销,在其中调用其他非内联函数应该是可以的,正如在程序代码中调用非内联行数一样的效果。
siriuscor 2003-05-02
  • 打赏
  • 举报
回复
但是代码是不是写的有问题,能通过吗?
siriuscor 2003-05-02
  • 打赏
  • 举报
回复
就把inline看作一个宏定义吧,只有在函数较短,又用了很多次的时候提高速度.
sandrowjw 2003-05-02
  • 打赏
  • 举报
回复
有一个相关的问题:
内联函数的局部变量解析会造成效率下降吗?是不是在内联函数中应该尽量少用局部变量?

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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