静态与内联函数的效率问题

fsssosei 发布于 2012/09/15 13:24
阅读 2K+
收藏 3
GCC
我看有介绍“静态函数会被自动分配在一个一直使用的存储区,直到退出应用程序实例,避免了调用函数时压栈出栈,速度快很多。”
内联函数也是节省了函数调用的开销
是否可以认为,从提高速度上来说,用内联和静态是等价的呢?
另外,静态函数是不是比非静态函数多占用内存呢?
加载中
0
中山野鬼
中山野鬼

单谈C ,你上面的解释,前面对,后面胡扯蛋。函数调用的方式和压栈出栈没联系。内联和静态完全不等价。内联和宏定义等价(如果确实内联进去了)。

静态函数,唯一能说“静态”是和link有关。关于函数代码所在的空间。不存在多占内存少占内存的问题。

极端情况下,内联函数导致代码量增加,由此导致从内存读取到CPU中的费用开销增加,由此效率降低,是会发生的。正常情况下,内联的代码可以和被嵌入的函数其他代码进行综合优化,效率肯定比CALL一个函数来的高。仅指令计算方面,跳转的费用是最高的。正常一个函数CALL 和RETURN,合起来超过10个cycle是事实。而可能内联的函数里,实际执行的费用也不过5,6个cycle就处理掉了。

0
Rifle
Rifle

引用来自“中山野鬼”的答案

单谈C ,你上面的解释,前面对,后面胡扯蛋。函数调用的方式和压栈出栈没联系。内联和静态完全不等价。内联和宏定义等价(如果确实内联进去了)。

静态函数,唯一能说“静态”是和link有关。关于函数代码所在的空间。不存在多占内存少占内存的问题。

极端情况下,内联函数导致代码量增加,由此导致从内存读取到CPU中的费用开销增加,由此效率降低,是会发生的。正常情况下,内联的代码可以和被嵌入的函数其他代码进行综合优化,效率肯定比CALL一个函数来的高。仅指令计算方面,跳转的费用是最高的。正常一个函数CALL 和RETURN,合起来超过10个cycle是事实。而可能内联的函数里,实际执行的费用也不过5,6个cycle就处理掉了。

+1,不过call+return超过是否10cycle,这要看具体情况和具体的体系结构(有些体系结构加入了一些技术,比如return stack)。函数的调用还会带来一些寄存器的保存和恢复,这也是有损耗的
0
中山野鬼
中山野鬼

引用来自“Rifle”的答案

引用来自“中山野鬼”的答案

单谈C ,你上面的解释,前面对,后面胡扯蛋。函数调用的方式和压栈出栈没联系。内联和静态完全不等价。内联和宏定义等价(如果确实内联进去了)。

静态函数,唯一能说“静态”是和link有关。关于函数代码所在的空间。不存在多占内存少占内存的问题。

极端情况下,内联函数导致代码量增加,由此导致从内存读取到CPU中的费用开销增加,由此效率降低,是会发生的。正常情况下,内联的代码可以和被嵌入的函数其他代码进行综合优化,效率肯定比CALL一个函数来的高。仅指令计算方面,跳转的费用是最高的。正常一个函数CALL 和RETURN,合起来超过10个cycle是事实。而可能内联的函数里,实际执行的费用也不过5,6个cycle就处理掉了。

+1,不过call+return超过是否10cycle,这要看具体情况和具体的体系结构(有些体系结构加入了一些技术,比如return stack)。函数的调用还会带来一些寄存器的保存和恢复,这也是有损耗的
是这样的。哈。说个大概。复杂的CPU管道技术,RETURN的跳转,CALL的跳转还是可以保证预测不被打破,但问题是很多数据需要等待到位后,CALL和RETURN才能真正执行完毕。
0
nsnail
nsnail
内联函数效率更高 , 是在当前执行体直接展开的, 没有函数(包括静态函数)调用callret等跳转指令,也避免了上下文环境的压栈出栈等内存创建销毁开销, 在循环当中还是区别很大的. 不过inline函数过长且重复利用率高的话 内存消耗会很大
0
中山野鬼
中山野鬼

引用来自“nsnail”的答案

内联函数效率更高 , 是在当前执行体直接展开的, 没有函数(包括静态函数)调用callret等跳转指令,也避免了上下文环境的压栈出栈等内存创建销毁开销, 在循环当中还是区别很大的. 不过inline函数过长且重复利用率高的话 内存消耗会很大
是的。内存消耗大,直接带来CODEING LOADING的费用提升。通常内联的函数,最好是能几个汇编指令就能实现的规模。否则,不要太折腾。基本的判断是,函数内实际逻辑的执行费用小于调用开销的一半。具体是多少,实际去测试,就有点过了。不方便跨平台移植,根据经验简单判断就可以。
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部