社区
C++ 语言
帖子详情
为什么函数体里有循环,就不适合inline?
panpanf1
2010-06-23 11:00:05
如题,经常看到有人这么说,但都说不出个所以然来,请大牛来解释解释
...全文
1593
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)
C++基础:
inline
函数
1.
inline
函数
1.1定义:
inline
函数
由
inline
关键字定义,引入
inline
函数
的主要原因是用它替代 C 中复杂易错不易维护的宏
函数
。 1.2编译器对
inline
函数
的处理办法 编译器在编译阶段完成对
inline
函数
的处理,即对
inline
函数
的调用替换为
函数
的本体。但
inline
关键字对编译器只是一种建议,编译器可以这样去做,也可以不去做。从逻辑上来说,编译器对
inline
函数
的处理步骤一般如下: (1)将
inline
函数
体复制到
inline
..
C++中
inline
深入解析:你写的
inline
真的有用吗?
在C++中,
inline
关键字用于指示编译器将
函数
的调用替换为
函数
体的代码。这种替换称为“内联”,它的主要目的是减少
函数
调用的开销。通常情况下,
函数
调用涉及到参数传递、栈帧的创建和销毁等操作,这些操作会消耗时间。通过内联,编译器可以直接将
函数
的代码插入到调用点,从而消除这些开销。在C++中,
inline
关键字可以在特定情况下提高性能,但并不是万能的。合理使用
inline
可以减少
函数
调用的开销,提高代码的可读性,但也要注意可能导致的代码膨胀和编译时间增加。
关于C/C++中的
inline
在c中,为了解决一些频繁调用的小
函数
大量消耗栈空间或是叫栈内存的问题,特别的引入了
inline
修饰符,表示为内联
函数
。 栈空间就是指放置程式的局部数据也就是
函数
内数据的内存空间,在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足所造成的程式出错的问题,
函数
的死
循环
递归调用的最终结果就是导致栈内存空间枯竭。
inline
的使用是有所限制的,
inline
只
适合
函数
体内代码简单的
函数
使
内联
inline
inline
inline
是一种优化建议,
适合
小而频繁调用的
函数
,既能保持
函数
语义,又有宏的性能优势。
inline
函数
什么是
inline
函数
一个
函数
的程序进行代码拓展而不被调用,用相应的
函数
代码替换
函数
调用。 引入
inline
函数
的原因 系统中会有这样的场景:for
循环
调用一个处理
函数
或则是递归调用一些算法。因为调用一个任意
函数
都会为这个
函数
创建栈空间,如果频繁的调用小
函数
会消耗大量的栈空间,对内存造成很大的压力。为了提高程序执行的效率,C++引入
inline
,内联
函数
的代码会被直接插入到每个调用
函数
的地方,从...
C++ 语言
65,211
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章