免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4724 | 回复: 10
打印 上一主题 下一主题

[函数] 内联函数调用用不着堆栈吧? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-31 14:51 |只看该作者 |倒序浏览
内联函数调用是否避免了函数传值占用堆栈??

论坛徽章:
0
2 [报告]
发表于 2007-01-31 16:18 |只看该作者
内联函数调好象没有规定一定要在编译时展开吧,有些情况下是当成普通函数用.
做内联是尽可能提高代码效率,而不是一定能提高效率
--个人理解,大家评论一下是否正确

论坛徽章:
0
3 [报告]
发表于 2007-01-31 16:21 |只看该作者
原帖由 sithui 于 2007-1-31 16:18 发表
内联函数调好象没有规定一定要在编译时展开吧,有些情况下是当成普通函数用.
做内联是尽可能提高代码效率,而不是一定能提高效率
--个人理解,大家评论一下是否正确


你说的这种情况属于编译器没有认同内联函数的必要性,从而没有编译为内联函数,仅仅当成普通函数来使用而已。

我想问的是在通过内联的编译之后,在主函数调用内联函数的时候是否就是直接展开而不需要堆栈了呢?

论坛徽章:
0
4 [报告]
发表于 2007-01-31 16:32 |只看该作者
内联函数和宏很类似,而区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。你可以象调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。

论坛徽章:
0
5 [报告]
发表于 2007-01-31 16:33 |只看该作者
在C++中,内联就是为了减少堆栈调用的.
编译器碰到内联就直接解释成produce了,over

论坛徽章:
0
6 [报告]
发表于 2007-01-31 16:36 |只看该作者
原帖由 oract666 于 2007-1-31 16:21 发表


你说的这种情况属于编译器没有认同内联函数的必要性,从而没有编译为内联函数,仅仅当成普通函数来使用而已。

我想问的是在通过内联的编译之后,在主函数调用内联函数的时候是否就是直接展开而不需要堆栈了 ...


是的,如果编译器接受了inline的建议
它就会在调用该函数的地方直接展开,从而减少了函数调用的额外开销

int min( int x, int y ){
     return x<y?x:y;
}

则下面的调用
cout << min( x,y ) << endl;
在编译时会展开为
cout << ( x<y?x:y ) << endl;

论坛徽章:
0
7 [报告]
发表于 2007-01-31 17:03 |只看该作者
--

堆是堆,栈是栈

--

论坛徽章:
0
8 [报告]
发表于 2007-01-31 17:08 |只看该作者
原帖由 langue 于 2007-1-31 17:03 发表
--

堆是堆,栈是栈

--


版主能否详细赐教一下?

论坛徽章:
0
9 [报告]
发表于 2007-01-31 17:14 |只看该作者
--

对于内联函数,编译器可以选择展开,也可以忽略它的 “内联” 属性而将其当作普通函数来对待。

当作普通函数对待的情况,我就不用说了吧。相当于直接把 __inline 去掉。

如果选择了展开,就等于选择了把内联函数里的代码插入到调用内联函数的地方。这样,参数不必从栈上 push, pop可是栈内存和堆内存仍然可以被用到

我所说的和楼上几位的差不多。

--

论坛徽章:
0
10 [报告]
发表于 2007-02-01 11:15 |只看该作者
应该是要占用堆栈的空间,只是减少了入和出的开销
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP