gpt4 book ai didi

c++ - VS 2008 C++ 构建输出?

转载 作者:可可西里 更新时间:2023-11-01 17:52:51 26 4
gpt4 key购买 nike

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

1>Compiling...
1>a.cpp
1>b.cpp
1>c.cpp
1>d.cpp
1>e.cpp
[etc...]
1>Generating code...
1>x.cpp
1>y.cpp
[etc...]

输出看起来好像在生成任何代码之前正在处理几个编译单元。这是真的吗?我正在尝试缩短构建时间,并且通过使用预编译的 header ,每个“.cpp”文件都得到了很大的加速,但是在“生成代码...”消息期间有一个相对较长的停顿。我没有打开“全程序优化”或“链接时间代码生成”。如果是这样,那为什么呢?为什么 VC++ 不单独编译每个“.cpp”(这将包括代码生成阶段)?如果这不仅仅是输出的幻觉,那么这里是否可能进行交叉编译单元优化?似乎没有任何编译器选项可以控制该行为(如上所述,我知道 WPO 和 LTCG)。

编辑:
构建日志仅显示输出目录中的“.obj”文件,每行一个。没有指示“编译...”与“生成代码...”步骤。

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

最佳答案

编译器架构

编译器不直接从源代码生成代码,它首先将其编译成中间形式(参见 compiler front-end),然后从中间形式生成代码,包括任何优化(参见 compiler back-end)。

Visual Studio 编译器进程产生

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

您可以通过使用 Process Explorer 查看 cl.exe 来确认这一点。

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

我的猜测是一次为多个文件生成代码是为了加快构建过程,因为它包含一些只能为多个源完成一次的事情,比如实例化模板——实例化它们没有用多次,因为除了一个之外的所有实例都会被丢弃。

整体程序优化

理论上,此时也可以执行一些交叉编译单元优化,但尚未完成 - 除非使用/LTCG 启用,否则不会进行此类优化,并且使用 LTCG 整个代码生成是一次完成整个程序(因此得名“全程序优化”)。

注意:WPO 似乎是由链接器完成的,因为它从 obj 文件生成 exe,但这是一种错觉 - obj 文件不是真正的目标文件,它们包含中间表示,并且“链接器”不是真正的链接器,因为它不仅链接现有代码,还生成和优化代码。

关于c++ - VS 2008 C++ 构建输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2377043/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com