将代码拆分为文件和 O 标志

Splitting code into files and O flags

在用C语言编写可以并行执行的代码的程序时,我们肯定会使用O flags来优化代码。

gcc -Olevel [options] [source files] [object files] [-o output file]

在大型项目中,我们通常split the code into several files。我没有找到答案的问题是:

由于我们将代码拆分为文件并且 O 标志没有足够的信息来进一步优化,程序的性能是否会完全下降?有这种可能吗?

当您将代码分解成单独的文件时,它可能会将其分成多个翻译单元,编译器通常无法对其进行优化。

以在一个翻译单元中定义但在许多其他翻译单元中引用的常量为例。所有引用常量的计算都必须在 运行 时执行,因为常量不能在编译时折叠到它们中。

Link-time optimization (-flto) 是绕过限制的一种方法。

单个单元优化

为了补充@Jason 的回答,我想post 另一种技术来避免拆分文件时出现的限制。

叫做Single Unit Optimization:

The Single Compilation Unit technique uses pre-processor directives to "glue" different translation units together at compile time rather than at link time. This reduces the overall build time, due to eliminating the duplication, but increases the incremental build time (the time required after making a change to any single source file that is included in the Single Compilation Unit), due to requiring a full rebuild of the entire unit if any single input file changes.

整个项目,即使拆分成文件,也可以进行优化,就好像程序的所有部分都对编译器一次可见一样,无需用户再次合并文件。

如何申请?

通常,该项目将包含一个带有主文件的文件,并将包含每个拆分文件的所有头文件:

main.c

#include "sub-program-1.h"
#include "sub-program-2.h"
...
#include "sub-program-n.h"
//rest of code

其中每个 .h 文件都对应于其各自的 .c,后者是自己编译的(可能通过 makefile)。

为了应用 SCU,我们删除了上面提到的包含文件,而是创建了一个新文件(我们称之为 SCU.c)。这将是以下内容。

SCU.c

#include "sub-program-1.c"
#include "sub-program-2.c"
...
#include "sub-program-3.c"
#include "main.c"
//no more code in this file

而要编译整个项目,我们只需编译 SCU.c