C++ precompiled-headers 体积巨大
C++ precompiled-headers huge in size
我有 2 个关于 c++ precompiled-headers 功能的问题。
1.What 当你制作一个 .gch 文件(使用 GCC)时实际上发生了,它包含什么?
2.Why那些文件太大了,但最终的可执行文件太小了。
当您预编译 header 时,一切都像通常的编译一样开始:
- 预处理器是 运行,包括任何依赖 header 并执行宏替换
- 生成的源代码被移交给编译器,编译器对其进行解析并验证语法
- 然后编译器生成 AST,该数据结构对代码语义进行编码
通常,这是在 .cpp
文件上完成的,然后继续实际编译 AST 并生成可执行代码。但是,header 预编译在那里停止,编译器将 AST 转储到 .gch
文件中。
在进一步使用这个预编译的 header 时,编译器可以直接从文件中加载 AST 并从那里获取它,跳过上面列出的昂贵处理。
.gch
文件很大,因为它包含大量隐含在原始 header 中的信息。但它与最终可执行文件的大小无关——使用和不使用预编译 headers 进行编译应该产生完全相同的结果。
我有 2 个关于 c++ precompiled-headers 功能的问题。
1.What 当你制作一个 .gch 文件(使用 GCC)时实际上发生了,它包含什么?
2.Why那些文件太大了,但最终的可执行文件太小了。
当您预编译 header 时,一切都像通常的编译一样开始:
- 预处理器是 运行,包括任何依赖 header 并执行宏替换
- 生成的源代码被移交给编译器,编译器对其进行解析并验证语法
- 然后编译器生成 AST,该数据结构对代码语义进行编码
通常,这是在 .cpp
文件上完成的,然后继续实际编译 AST 并生成可执行代码。但是,header 预编译在那里停止,编译器将 AST 转储到 .gch
文件中。
在进一步使用这个预编译的 header 时,编译器可以直接从文件中加载 AST 并从那里获取它,跳过上面列出的昂贵处理。
.gch
文件很大,因为它包含大量隐含在原始 header 中的信息。但它与最终可执行文件的大小无关——使用和不使用预编译 headers 进行编译应该产生完全相同的结果。