标头文件和makefile如何在c ++中帮助增量编译?

问题描述 投票:2回答:1

我了解增量编译是什么:当编译器仅编译您编辑的代码时,并不会全部编译。但是,将代码分为.h和.c / .cc文件以及C ++中的makefile如何帮助增量编译?

c++ makefile compilation header incremental-compiler
1个回答
1
投票

头文件实际上对编译的增量适得其反。对任何标头的任何更改都将导致重新编译所有包含标头的源文件(甚至间接通过另一个标头)。但是标题使跨多个翻译单元的所有定义保持一致(语言所要求的语言)变得容易得多,因此实际上必须使用它们。这种相反的生产率是“仅包含您需要的内容”是要考虑的经验法则的原因。

什么有助于增量编译就是每个翻译单元的定义减少。如果您将整个程序写在单个源文件中,那么对该程序任何小部分的微小更改都会导致整个程序需要重新编译。

如果改为将每个函数都写在单独的源文件中,则对这些函数中的任何一个进行修改都将仅需要重新编译该微小的源文件,然后将其与未经修改的先前编译的目标文件链接在一起。通常,编译单个函数比编译整个程序要快。尽管,例如,如果更改是函数的参数,则也必须重新编译调用该函数的所有内容(即其依赖对象)(因此,在这种情况下,更改位于头文件中,并且所有依赖对象必须包含标题)。

具有多个源文件的另一个优点是,它们可以独立编译,因此可以并行进行编译,这对于当今的多核处理器来说是一个很大的优势,更不用说计算机系统无休止的数据中心了。但是,也有缺点:当有很多内联函数(特别是包括所有模板)时,从头开始的非增量编译通常会比较昂贵,需要为使用它们的每个单独的源文件重新编译它们。

诸如make和ninja之类的构建系统是工具,它们具有以下其他功能:跟踪先前编译的源文件,并确定修改后哪些源文件需要重新编译。该决定通常基于源文件(和所有包含的文件)与其编译后的目标文件相比的修改时间。

© www.soinside.com 2019 - 2024. All rights reserved.