为什么函数体里有循环,就不适合inline?

panpanf1 2010-06-23 11:00:05
如题,经常看到有人这么说,但都说不出个所以然来,请大牛来解释解释
...全文
1281 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangwis87928 2010-07-07
  • 打赏
  • 举报
回复
头都晕了
skyworth98 2010-06-26
  • 打赏
  • 举报
回复
sp

[Quote=引用 37 楼 taget 的回复:]
好像叫 代码膨胀吧 哈哈
[/Quote]
skyworth98 2010-06-26
  • 打赏
  • 举报
回复
不知道您的inline展开指的是什么。
我大概看了一下产生的汇编代码,貌似那两个函数都没有被调用,编译器貌似是直接算出了结果,然后调用了printf。

[Quote=引用 35 楼 algorithms_memo 的回复:]
说真的,有没有循环和inline是否展开没必然联系。比如如下代码:

C/C++ code

#include <stdio.h>

inline int loops_sum(int x, int y, int repeat)
{
int i, rtn, itmp = x+y;

if (repeat < 0 )repeat = -repeat;……
[/Quote]
skyworth98 2010-06-26
  • 打赏
  • 举报
回复 2
这个只是理论上的,但实际上,函数是否会被inline处理,并不在于你是不是用inline关键字指明,而是由编译器根据自身的算法决定,而各个编译器的实现并不尽相同。

我们需要了解的是,我们为什么需要inline,编译器在后台对inline函数作了那些处理。
Something changes, some do not.


[Quote=引用 28 楼 healer_kx 的回复:]
呵呵,是啊if也用到了跳转指令了啊。。。 。。。也不能inline吗?
hoho~
[/Quote]
EliQiao 2010-06-26
  • 打赏
  • 举报
回复
好像叫 代码膨胀吧 哈哈
skyworth98 2010-06-26
  • 打赏
  • 举报
回复 1
inline的目的是通过空间来换时间,也就是说,通过复制代码来减少函数调用。
而如果代码块中有(条件)跳转,因跳转产生的代价就差不多可以抵消函数调用带来的开销,因而几乎没有必要作inline处理。

[Quote=引用 27 楼 panpanf1 的回复:]
引用 26 楼 skyworth98 的回复:
inline实际上“相当于”宏替换,就是把函数的二进制代码直接复制到调用的地方,因而inline代码不应该有跳转。而循环结构无法避免条件跳转,所以有循环的代码无法inline


引用楼主 panpanf1 的回复:
如题,经常看到有人这么说,但都说不出个所以然来,请大牛来解释解释

为什么有跳转,就不能inline?
[/Quote]
  • 打赏
  • 举报
回复
可以用 __forceinline
liutengfeigo 2010-06-23
  • 打赏
  • 举报
回复
忽视这东西。
Yanger_xy 2010-06-23
  • 打赏
  • 举报
回复
inline是将代码copy到指定的位置,放在循环当中就会大量的复制代码,这样你能吃得消吗?
healer_kx 2010-06-23
  • 打赏
  • 举报
回复
从实践的角度看,就不要写inline了,忘记它。
因为你写了inline,未必内联。
但是编译器也会把一些你没写inline的,内联了。那么inline还需要我们写吗?
cswuyg 2010-06-23
  • 打赏
  • 举报
回复
应该是循环里边是否可以有内联的问题吧。
用inline修饰的函数,不一定会被内联展开。要看内联之后代码多不多,如果代码不多的话,编译器会给你内联,如果代码太多,编译器不会给你内联。
healer_kx 2010-06-23
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 colorfulcode 的回复:]

以前做过一个实验,在VC2005中,一个含有for的函数(函数不长且没有声明为inline),

在debug下,汇编代码中有一个函数调用动作,
而在release下,汇编中则直接将函数的内容拉到了调用者的体内

并且,debug下可以但不到被调用函数内部,而在release下则进不到函数里面。

所以,函数里面含有for有时候还是可以inline的,
但for里面含有函数就不知……
[/Quote]

看,我的猜测还是准确的吧? 我就知道循环的汇编是可以被inline的。
pengzhixi 2010-06-23
  • 打赏
  • 举报
回复
你可以忽略这个关键字,你控制不了的。
colorfulcode 2010-06-23
  • 打赏
  • 举报
回复
以前做过一个实验,在VC2005中,一个含有for的函数(函数不长且没有声明为inline),

在debug下,汇编代码中有一个函数调用动作,
而在release下,汇编中则直接将函数的内容拉到了调用者的体内

并且,debug下可以但不到被调用函数内部,而在release下则进不到函数里面。

所以,函数里面含有for有时候还是可以inline的,
但for里面含有函数就不知道了,唯有顶9楼了。

P.S.: 以前看过exceptional C++ style 中对于inline的说明,感觉加不加inline已经没用了,完全可以由编译器来自行判断是否inline
yidasoft 2010-06-23
  • 打赏
  • 举报
回复
inline在编译过程是直接复制代码的,如果出现大的循环想想编译器够凄惨的
lvshaoqing 2010-06-23
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 healer_kx 的回复:]
引用 9 楼 lvshaoqing 的回复:

引用 8 楼 healer_kx 的回复:
引用 7 楼 lvshaoqing 的回复:

引用 5 楼 panpanf1 的回复:
引用 3 楼 lthyxy 的回复:

如果有循环 编译器吃不消啊,
不能自己棒你插代码进去。

不明白


嘿嘿,把分数给我把。 这个还是得靠我。

赶紧说吧,说完了,我给你分。

……
[/Quote]

我说的就是for循环。
starcat 2010-06-23
  • 打赏
  • 举报
回复
Thinking in C++ second edition Volume2
liutengfeigo 2010-06-23
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wzyzb 的回复:]

引用 10 楼 starcat 的回复:

呵呵,手头没书,不然CTRL+C,CTRL+V搞定
啥意思?
[/Quote]
电子书。
wzyzb 2010-06-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 starcat 的回复:]

呵呵,手头没书,不然CTRL+C,CTRL+V搞定
[/Quote]啥意思?
healer_kx 2010-06-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lvshaoqing 的回复:]

引用 8 楼 healer_kx 的回复:
引用 7 楼 lvshaoqing 的回复:

引用 5 楼 panpanf1 的回复:
引用 3 楼 lthyxy 的回复:

如果有循环 编译器吃不消啊,
不能自己棒你插代码进去。

不明白


嘿嘿,把分数给我把。 这个还是得靠我。

赶紧说吧,说完了,我给你分。


好,记得我分数啊。
大家都以为某函……
[/Quote]

你说的这是递归啊,。。。
加载更多回复(21)

64,682

社区成员

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

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