C编译器优化(gcc):自动内联非静态函数与静态函数

时间:2016-11-24 05:20:48

标签: c gcc static

我已经看到使用优化级别3的GCC编译器内联静态函数,但在一种情况下不内联非静态函数。而在其他情况下,无论是静态还是非静态,它都会内联函数。 我想知道什么参数可以选择内联静态或非静态函数。

1 个答案:

答案 0 :(得分:0)

来自gcc的手册:

  

-O3优化更多。 -O3打开-O2指定的所有优化,并打开-finline-functions,              -funswitch-loops,-fpredictive-commoning,-fgcse-after-reload,-ftree-loop-vectorize,-ftree-loop-distribute-patterns,              -fsplit-paths -ftree-slp-vectorize,-fvect-cost-model,-ftree-partial-pre和-fipa-cp-clone选项。

好像你的评论来自-finline-functions选项:

  

-finline函数

     

考虑所有内联函数,即使它们未以内联方式声明。编译器启发式地决定哪个              功能值得以这种方式集成。

     

如果集成了对给定函数的所有调用,并且该函数被声明为“静态”,则该函数是正常的              不能以汇编代码的形式输出。

     

在-O3级启用。

事实上,所有函数都需要通过gcc in -O3优化模式进行内联,无论是内联,静态,还是两者都没有。

这是gcc的另一部分联机帮助页(-Winline选项):

  

编译器使用各种启发式方法来确定是否内联函数。例如,编译器              考虑到内联函数的大小以及已经完成的内联量              当前的功能。

因此gcc使用函数的大小和函数中内联的大小来选择内联或不内联。如果你想了解更多关于这些启发式的信息,我担心你可能需要查看gcc的源代码:)