Chinaunix

标题: 内联函数调用用不着堆栈吧? [打印本页]

作者: oract666    时间: 2007-01-31 14:51
标题: 内联函数调用用不着堆栈吧?
内联函数调用是否避免了函数传值占用堆栈??
作者: sithui    时间: 2007-01-31 16:18
内联函数调好象没有规定一定要在编译时展开吧,有些情况下是当成普通函数用.
做内联是尽可能提高代码效率,而不是一定能提高效率
--个人理解,大家评论一下是否正确
作者: oract666    时间: 2007-01-31 16:21
原帖由 sithui 于 2007-1-31 16:18 发表
内联函数调好象没有规定一定要在编译时展开吧,有些情况下是当成普通函数用.
做内联是尽可能提高代码效率,而不是一定能提高效率
--个人理解,大家评论一下是否正确


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

我想问的是在通过内联的编译之后,在主函数调用内联函数的时候是否就是直接展开而不需要堆栈了呢?
作者: sithui    时间: 2007-01-31 16:32
内联函数和宏很类似,而区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。你可以象调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。
作者: 宋江    时间: 2007-01-31 16:33
在C++中,内联就是为了减少堆栈调用的.
编译器碰到内联就直接解释成produce了,over
作者: jackk294    时间: 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;
作者: langue    时间: 2007-01-31 17:03
--

堆是堆,栈是栈

--
作者: oract666    时间: 2007-01-31 17:08
原帖由 langue 于 2007-1-31 17:03 发表
--

堆是堆,栈是栈

--


版主能否详细赐教一下?
作者: langue    时间: 2007-01-31 17:14
--

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

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

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

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

--
作者: arenxl    时间: 2007-02-01 11:15
应该是要占用堆栈的空间,只是减少了入和出的开销
作者: zwylinux    时间: 2007-02-01 14:39
原帖由 langue 于 2007-1-31 17:03 发表
--

堆是堆,栈是栈

--


通常的说法是,堆栈就是栈,堆就是堆




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2