2010-05-20 60 views
0

我不知道它有多可行,这个问题在这里有多明智。推荐gcc内联函数

是否有任何变化,我们可以在Makefile中做出推荐GCC内联的所有功能,虽然功能没有在源文件中的声明中内联还是行不通的。

+0

从您的评论下面,看来你需要调整你的项目相当多,使这项工作。退后一步可能是好事,并考虑这是否真的有必要。你有没有分析你的程序,并确定函数调用开销显着减慢?如果不是,那么为了函数内联而大规模地重构你的程序可能是一个非常糟糕的主意。正如Knuth所说:我们应该忘记小效率,大约97%的时间:**不成熟的优化是所有邪恶的根源**。 – 2010-05-29 19:26:31

回答

1

gcc的-finline_functions选项听起来可能做你想要什么。这里是some documentation。如果你的makefile定义了一个CFLAGS变量,那将是放置它的地方。

+0

感谢您的回答。我会尝试并继续更新。 – thetna 2010-05-20 21:37:00

+0

我尝试了你在这里提到的方式。它只适用于单一的soruce代码文件。那么彼此包含的多个源代码文件如何? – thetna 2010-05-29 13:29:18

+0

@thetna:如果不知道你的项目是如何构建的,以及迄今为止尝试过的东西,那很难说更多的东西。但是MichałTrybus提出了一个很好的观点 - 函数内联不能跨翻译单元使用;函数定义必须在每个源文件中可用,例如将函数定义放在.h文件中并将其包含在每个.c文件中。如果你的项目还没有像这样构建,那么-finline_functions选项不会有太大的作用,正如你所看到的......你需要重新安排代码。 – 2010-05-29 19:16:34

3

有几个方法可以使GCC内联函数。其中之一是选项-finline-functions,这将使gcc内联“简单”功能。编译器使用一些启发式来确定函数是否足够小以便内联。但是,用户通过-finline-limit可以控制该算法。阅读gcc手册以找到您需要的实际值。

当内联函数,你应该记住,显然不是所有的功能都可以被内联(最简单的例子是递归函数),编译器可以内联只能在同一翻译单元中定义的函数。此外,值得一提的是,-finline-functions默认为-O3,所以只有-O3有时可能是您的解决方案。

在生成文件中,您将有权利选择加入到GCC的所有呼叫。在一个写得很好的makefile中,你可以很容易地发现其他gcc选项的变量,你可以简单地放置你自己的变量。

+0

感谢您的回答。我会尝试并继续更新。 – thetna 2010-05-20 21:36:29

+0

我试过你在这里提到的方式。它只适用于单一的soruce代码文件。那么彼此包含的多个源代码文件如何? – thetna 2010-05-29 13:28:31

+0

如果某些源文件确实包含在用'-finline-functions'编译的源文件中,那么编译器(和您,通过使用适当的选项)允许的所有内容都应该正确地内联。但是,在实际情况中,文件是单独编译的,并且在一个文件中定义的函数不会内联在另一个文件中,因为编译后者时编译器不知道其定义。确保函数始终内联的唯一方法是将整个定义添加到头文件中,并确保它包含在使用该函数的所有文件中。你不能用Makefile来完成。 – 2010-05-29 13:44:26