删除"静态"关键字对函数的影响

Tom*_*m's 2 c

最近,我学会了" 回溯 "功能的存在.此函数允许在某些情况下检索在没有调试信息的情况下编译的ELF运行程序的callstack.

它对我来说是完美的(我不能在生产程序中插入调试符号),但是对于"回溯"工作,有(大致)两个条件:

  • 告诉链接器添加额外信息(通过传递-rdynamic选项).
  • 将所有"静态"函数转换为"非静态"函数.

我担心的是,如果我满足这两个条件,我的程序将会变慢(因为编译器无法优化非静态函数,因为他优化了静态函数?).据我所知,使用-rdynamic添加额外信息不会影响程序的性能:它只是给ELF二进制文件增加了一点重量.

所以这是我的问题:

当所有静态函数变为非静态函数时,运行性能的影响是什么?

cma*_*ter 5

是的,您的后顾之忧是正确的:声明一个函数可以static为编译器提供一个很好的提示,它可以转化为更好的优化.但是,您获得的加速量static取决于您的精确情况,因此测量中只有真实情况(就性能而言).

关于声明一个函数static的问题,编译器肯定知道,它看到函数的所有调用站点.如果它看到,该函数只从一个地方调用,它通常总是内联它,无论它有多长.内联可能会为进一步优化提供更多机会.这避免了在大小和速度方面的函数调用开销.在这,static实际上是一个更强的暗示inline.

当然,对性能的影响取决于对static函数调用的频率.因此,正如我所说,您需要通过衡量来评估从static关键字中获得的性能.