社区
C++ 语言
帖子详情
为什么函数体里有循环,就不适合inline?
panpanf1
2010-06-23 11:00:05
如题,经常看到有人这么说,但都说不出个所以然来,请大牛来解释解释
...全文
1446
41
打赏
收藏
为什么函数体里有循环,就不适合inline?
如题,经常看到有人这么说,但都说不出个所以然来,请大牛来解释解释
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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]
高性能架构探索
2010-06-23
打赏
举报
回复
可以用 __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)
C++内联
函数
inline
原理理解
转载:C++内联
函数
(C++
inline
)详解 (biancheng.net) 内联
函数
的使用方法无需多讲,重点在于原理。 重点: 1.执行普通
函数
需要执行如下的过程。 2.如果每次写代码不调用
函数
,直接把
函数
里面内容写在代码中效率会比较高。写
函数
只是为了使代码简洁,但实际上增加代码的开销。而内联
函数
的作用就相当于把
函数
体写整体写到代码中,提高了效率 ...
inline
函数
的注意事项有哪些?
inline
函数
由
inline
关键字定义,引入
inline
函数
的主要原因是用它替代C中复杂易错不易维护的宏
函数
。
inline
函数
的注意事项有哪些? 在使用内联
函数
时,要注意以下几个事项和建议: 1、使用
函数
指针调用内联
函数
将会导致内联失败。 也就是说,如果使用
函数
指针来调用内联
函数
,那么就需要获取
inline
函数
的地址。如果要取得一个
inline
函数
的地址,编译器就必须为此
函数
产生一个
函数
实体,那么就内联失败。 2、如果
函数
体代码过长或者有多重
循环
语句,if或witch分支语句或递归时,不宜用内联。 3、
C++
inline
函数
1.C++引用
inline
原因 在我们的系统中可能经常会有一些场景:for
循环
调用一个工具处理
函数
或则是递归调用一些算法。我们知道调用一个任意
函数
都会为这个
函数
创建栈空间,如果频繁的调用小
函数
会消耗大量的栈空间,对内存造成很大的压力,甚至会导致内存枯竭。C++为了解决这个问题也就创造了内联
函数
,也就是
inline
。 下面我们看一个使用内联
函数
的例子: #include <stdio.h>...
内联
函数
—— C 中关键字
inline
用法解析
1、
inline
函数
不要超过10行代码,且不能包含
循环
、switch、if语句 2、在一个c文件中定义的
inline
函数
是不能在其它c文件中直接使用,google推荐把
inline
函数
定义在**-inl.h头文件中。 3、不要过度使用
inline
函数
定义,尤其对大
函数
来说 上面三点说明如何正确的使用
inline
函数
,我以前的时候对
inline
理解不透彻,使用
inline
的方式不正确,但现在编译器够...
基本语言细节--
inline
函数
的几点分析
基本语言细节--
inline
函数
的几点分析 1.定义:内联
函数
从源代码层看,有
函数
的结构,而在编译后,却不具备
函数
的性质。内联
函数
不是在调用时发生控制转移,而是在编译时将
函数
体嵌入在每一个调用处。编译时,类似宏替换,但比宏更安全,使用
函数
体替换调用处的
函数
名。一般在代码中用
inline
修饰,但是能否形成内联
函数
,需要看编译器对该
函数
定义的具体处理。 2.好处:内联扩展是用来消除
函数
调用时的时间
C++ 语言
65,180
社区成员
250,527
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章