巨大的 C++ 预编译 header

标签 c++ precompiled-headers

我有 2 个关于 C++ 预编译 header 功能的问题。

1. 当您创建一个 .gch 文件(使用 GCC)时实际上发生了什么,它包含什么?

2.为什么这些文件这么大,但最终的可执行文件却这么小。

最佳答案

当你预编译一个头文件时,一切都像通常的编译一样开始:

  • 运行预处理器,包括任何依赖的头文件并执行宏替换
  • 生成的源代码被移交给编译器,编译器对其进行解析并验证语法
  • 然后编译器生成 AST,一种对代码的语义进行编码的数据结构

通常,这是在 .cpp 文件上完成的,然后继续实际编译 AST 并生成可执行代码。但是, header 预编译就此停止,编译器将 AST 转储到 .gch 文件中。

在进一步使用这个预编译头文件时,编译器可以直接从文件中加载 AST 并从那里获取它,跳过上面列出的代价高昂的处理。

.gch 文件很大,因为它包含大量隐含在原始 header 中的信息。但它与最终可执行文件的大小无关——使用和不使用预编译头进行编译应该产生完全相同的结果。

关于巨大的 C++ 预编译 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42157142/

相关文章:

c++ - 需要对#pragma once 做一些澄清

macos - 在 OSX 上预编译头和编译通用对象

ios - 如何将预编译头文件添加到我的 ios 项目中?

visual-c++ - 将定义的符号与预编译头相乘?

c++ - 为什么排序不及时 O(n log (n))

c++ - 使成员变量对象可修改但不可赋值

c++ - 套接字文件描述符在不同进程之间是相同的

c++ - 交互类 - 组织代码

c++ - 没有返回类型的静态函数可以在 Windows 上通过编译但在 Linux 上不能

c++ - VS Intellisense 如何在编辑头文件时从 stdafx.h 中找到定义?