VS 2008 C++构建输出?

8 c++ compiler-construction msbuild visual-studio visual-c++

为什么当我在VS中看VC++项目的构建输出时,我看到:

1>编译...
1> a.cpp
1> b.cpp
1> c.cpp
1> d.cpp
1> e.cpp
[etc ...]
1>生成代码...
1> x.cpp
1 > y.cpp
[等...]

在生成任何代码之前,输出看起来好像正在处理几个编译单元.这真的发生了吗?我正在尝试改善构建时间,并且通过使用预编译的头文件,我为每个".cpp"文件获得了很大的加速,但是在"生成代码..."消息期间有一个相对较长的暂停.我没有启用"整个程序优化"或"链接时间代码生成".如果是这样的话,为什么呢?为什么VC++不单独编译每个".cpp"(包括代码生成阶段)?如果这不只是输出的假象,那么交叉编译单元优化是否会在这里进行?似乎没有任何编译器选项来控制该行为(我知道WPO和LTCG,如上所述).

编辑:
构建日志只显示输出目录中的".obj"文件,每行一个.没有迹象表明"编译......"与"生成代码......"步骤.

编辑:
我已经确认此行为与工具 - >选项 - >项目和解决方案 - >构建和运行中的"最大并行项目构建数"设置无关.它也与MSBuild项目构建输出详细程度设置无关.实际上,如果我在"生成代码..."步骤之前取消构建,则最新的"已编译"文件集中不会存在任何".obj"文件.这意味着编译器真正在一起处理多个翻译单元.为什么是这样?

Sum*_*uma 5

编译器架构

编译器不直接从源生成代码,它首先将其编译为中间形式(请参阅编译器前端),然后从中间形式生成代码,包括任何优化(请参阅编译器后端).

Visual Studio编译器进程生成

在Visual Studio构建中,执行编译器进程(cl.exe)以在一个命令中编译共享相同命令行选项的多个源文件.编译器首先对每个文件顺序执行"编译"(这很可能是前端),但是一旦使用它们进行编译,就会对所有文件一起完成"生成代码"(可能是后端).

您可以通过使用Process Explorer观察cl.exe来确认这一点.

为什么一次为多个文件生成代码

我的猜测是对多个文件正在做一次代码生成做是为了使构建过程更快,因为它包含了一些事情可以做一次多源,如实例化的模板 - 它没有使用多次实例化它们,因为所有实例,但无论如何都会被丢弃.

整个程序优化

从理论上讲,此时也可以执行一些交叉编译单元优化,但是没有完成 - 除非使用/ LTCG启用,否则不会进行任何此类优化,而使用LTCG,整个代码生成都是针对整个程序一次(因此整个程序优化名称).

注意:它好像WPO被连接完成,因为它产生的EXE从OBJ文件,但这是一种错觉 - obj的文件是不是真正的目标文件,它们所包含的中间表示,和"接头"是不是真正的链接器,因为它不仅链接现有代码,它还生成和优化代码.