什么把预编译头? (MSVC)
什么是预编译头文件的最佳候选人? 我可以将STL和Boost标题放在那里,即使它们有模板吗? 这会减less编译时间? 另外,什么是最好的IDE设置来减less编译时间?
快速回答:即使这些头文件定义了模板类,STL和Boost头确实属于预编译的头文件。
在生成预编译头文件时,编译器会parsing头文本(一项重要的任务!),并将其转换为针对编译器优化而优化的二进制格式。
即使在编译其他.cpp文件时,模板类也将被实例化,但它们将从预编译头中的信息实例化,这对于编译器来说是显着更快的。
(后来增加)
有一件事情你不应该包含在预编译头文件是你的项目的一部分,经常改变,即使每个.CPP文件包括这些文件。
原因是这样的 – 预编译头文件的生成可能需要很长时间,因为boost,stl和windows库是非常大的。
你可能有一个简单的文件(例如“StringDefs.h”),一切都使用。 如果StringDefs.h包含在stdafx.h中,并且有一个开发人员触及了StringDefs.h,那么每个开发人员都必须等到整个预编译头文件重新编译。 如果StringDefs.h不在预编译的头文件中,并且与每个.CPP文件一起parsing,会更快。
安德鲁·谢泼德的答案的一个补充。 对于项目外部的头文件,使用预编译头文件来处理不经常更改的文件。 如果您一直在更改当前项目中的头文件,则可能不值得对其进行预编译。
我写了一篇减less编译时间的技巧。 在这些技术中,预编译头文件及其应用程序可以在这里find。 它还有一个关于您可能会感兴趣的最佳实践的部分。 包含透明地处理它的CMake脚本。
把任何东西放在预编译的头文件中,那个项目中的大多数.cpp文件都会包含它。 这适用于任何头文件,真的。 这允许编译器parsing这些文件一次,然后在同一个项目中的所有.cpp文件中重用该信息。