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

时间:2017-04-03 09:03:36

标签: c

最近,我了解到“backtrace”功能的存在。 此函数允许在某些情况下检索在没有调试信息的情况下编译的ELF运行程序的callstack。

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

  • 告诉链接器添加额外信息(通过传递-rdynamic选项)。
  • 将所有“静态”功能转换为“非静态”功能。

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

所以这是我的问题:

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

3 个答案:

答案 0 :(得分:5)

是的,您的后顾之忧是正确的:将函数声明为static可以为编译器提供一个很好的提示,它可以转化为更好的优化。但是,您从static收到的加速量取决于您的确切情况,因此测量中只有真实情况(与性能一样)。

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

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

答案 1 :(得分:3)

  

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

答案是"有些",我想。唯一可以确定性能问题的方法是使用和不使用静态函数来衡量程序的性能。我能想到的最明显的事情是优化器可能无法内联非静态函数。

您实际上并不需要使静态函数非静态,唯一的问题是回溯中缺少符号名称。

然而,我认为你有更大的问题。从您的手册页链接:

  

省略帧指针(如任何gcc(1)的非零优化级别所暗示的那样)可能会导致违反这些假设。

为使backstrace可靠地工作,看起来你必须在没有优化的情况下进行编译。这肯定会对性能产生巨大影响。我想我没有它就能管理。

答案 2 :(得分:-2)

  

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

答案 - 无

静态函数意味着该函数仅对该文件可见,并且不能在该文件外部调用。即它具有文件范围

当您不希望功能与其他人的功能冲突时,静态功能通常用于大型程序。静态函数确保您可以定义函数并在自己的文件中使用它,而其他人也可以在其他文件中定义相同的静态函数名。

如果您的代码在删除static关键字后编译,那么您没有两个具有相同名称的函数,它将像任何普通函数一样工作。

它没有运行时间的惩罚。