社区
C++ 语言
帖子详情
为什么函数体里有循环,就不适合inline?
panpanf1
2010-06-23 11:00:05
如题,经常看到有人这么说,但都说不出个所以然来,请大牛来解释解释
...全文
1281
41
打赏
收藏
为什么函数体里有循环,就不适合inline?
如题,经常看到有人这么说,但都说不出个所以然来,请大牛来解释解释
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
MUI-H5 PULS混合开发视频教程
MUI是国内最主流的跨平台APP开发框架 RN是国外最主流的跨平台APP开发框架,MUI是基于webview进行渲染的,RN是基于原生组件进行渲染,从功能和
体
验上RN更加接近原生,但是学习难度相对比MUI来说稍微高一些
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
函数
1.1定义:
inline
函数
由
inline
关键字定义,引入
inline
函数
的主要原因是用它替代 C 中复杂易错不易维护的宏
函数
。 1.2编译器对
inline
函数
的处理办法 编译器在编译阶段完成对
inline
函数
的处理,即对
inline
函数
的调用替换为
函数
的本
体
。但
inline
关键字对编译器只是一种建议,编译器可以这样去做,也可以不去做。从逻辑上来说,编译器对
inline
函数
的处理步骤一般如下: (1)将
inline
函数
体
复制到
inline
..
C++ 语言
64,682
社区成员
250,491
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章