我已经看到使用优化级别3的GCC编译器内联静态函数,但在一种情况下不内联非静态函数。而在其他情况下,无论是静态还是非静态,它都会内联函数。 我想知道什么参数可以选择内联静态或非静态函数。
答案 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的源代码:)