为什么预编译头(Precompiled Header)能够提高编译速度?

上一篇博客我解释了“为什么可以引用未包含的头文件内容?”,这也让我想起了另外一个问题:“为什么预编译头(Precompiled Header)能够提高编译速度?”。既然要刨根问底,不妨再解释一下这个问题。其实呢,只要理解“编译 – 链接”这两个步骤各自的作用和一般编译器提高编译速度的方式,那这个问题是小菜一碟啊。

编译(Compile)——把每个源码文件编译成二进制文件(一般是obj)。链接(Link)——把所有的Obj文件堆积木一样组织在一起,形成了DLL、EXE等类型的目标文件。

一般来说,如果一个文件所依赖的所有项如头文件等都没有修改过,那么该文件就不需要重新编译。不管是makefile还是VC的project通过检测依赖关系,减少重新编译的代码量来提高编译速度的。

那么就不难理解为什么预编译头能够提高编译速度了。如果StdAfx.h里面的头文件在每一份实现文件里面都重新包含了一遍,那么每一次实现文件的修改都会导致该文件的重新编译,因而所包含的头文件都要展开一次用于重新编译,无疑会放慢编译速度。然而,如果将公用而不常修改的头文件置于StdAfx.h里面,那么编译器会在第一次遇到StdAfx.h的时候将它编译解释生成stdafx.obj和一个PCH文件,以后再遇到StdAfx.h的时候就会直接使用PCH文件,而不会重新编译了。对于MFC和SDK几万行的头文件来说,速度当然会有大大提高啦。

About 王永杰

路漫漫其修远兮,吾将上下而求索
This entry was posted in C&C++, 为什么?, 技术为本. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>