gpt4 book ai didi

c++ - 如何有效地使用预编译头文件(使用/Yc 和 Yu 选项)?

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

我们使用Visual Studio 2003 (VC71) 进行编译。为了减少编译时间,我们更改了构建脚本,使其为每个 CPP 文件生成预编译头 (.pch) 文件。

makefile 中使用的选项:

/Yc"StdAfx.h"
/Fp"StdAfx.pch"

这样目标的编译时间减少了 30%。但是任何人都可以帮助我理解它是如何减少编译时间的,即使每次编译每个 CPP 文件时都会生成 pch 文件。

此外,这是正确的方法吗?我们应该使用 Yc 和 Yu 组合吗?我不能使用/Yu 选项,因为 pch 文件应该至少生成一次。

最佳答案

问题

假设您有一个您知道不会更改的 header 列表。例如,C 头文件,或 C++ 头文件,或 Boost 头文件等。

为每个 CPP 文件编译读取它们需要时间,而且这不是有效时间,因为编译器一次又一次地读取相同的头文件,并一次又一次地为这些相同的头文件生成相同的编译结果。

应该有一些方法告诉编译器那些 header 总是相同的,并缓存它们的编译结果而不是一次又一次地重新编译它们,不是吗?

解决方案

预编译 header 会考虑到这一点,因此您只需:

  1. 将所有那些通用且不变的包含放在一个头文件中(例如,StdAfx.h)
  2. 有一个空的 CPP 文件(例如,StdAfx.cpp),其中仅包含一个头文件

现在,您需要告诉编译器 StdAfx.cpp 是包含通用和不变 header 的空源。

这是使用标志/Yc 和/Yu 的地方:

  • 使用/Yc 标志编译 StdAfx.cpp 文件
  • 使用/Yu 标志编译所有其他 CPP 文件

并且编译器将从 StdAfx.cpp 文件生成(需要时)一个预编译头文件,然后将这个预编译头文件重新用于所有其他标有/Yu 的文件。

注意事项

当您创建一个新项目时,旧版本的 Visual C++(如果我没记错的话,是 6 和 2003)会默认激活预编译头文件。最近的提供了激活或不激活它们的选择。

您应该创建一个新的 VC++ 项目并激活 PCH 以获得启用 PCH 的项目的工作版本,并研究编译选项。

有关PCH的更多信息,您可以访问以下网址:

关于c++ - 如何有效地使用预编译头文件(使用/Yc 和 Yu 选项)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5177046/

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