大型模板化项目的编译速度很慢,STL是其中的罪魁祸首,这似乎来自于经验证据。但是,为什么编译速度慢?
我之前通过观察标题包含和组合编译单元来优化构建,但我不明白为什么模板库的编译速度非常慢。
答案 0 :(得分:16)
由于古老的包含机制,C ++通常编译速度慢,这会导致编译器递归地重新解析每个标头及其所有声明和定义以及所有包含的每个转换单元。
模板只是建立在“功能”上。但它们也要求所有代码都在头文件中,迫使编译器也重新解析所有模板中的所有实现。
答案 1 :(得分:4)
必须将模板化代码作为生成C ++代码的另一种语言。
以这种思维方式,模板化代码必须被解析,执行,然后编译器可以生成必须添加到当前单元文件的C ++代码,然后我们就可以编译整个C ++代码。
我听说并非所有编译器都这样做,但这是主要的想法,并且假设在编译代码之前还有很多事情发生,因为必须先生成一些代码。
答案 2 :(得分:1)
部分答案在你的问题中。您无法监视包含模板的标头,因为必须将完整实现包含在使用它们的每个编译单元中。
答案 3 :(得分:1)
想想真实世界的模板是什么 - 它不是一个真实的东西,而是关于如何构建实际的东西的方向。
对于C ++模板,头文件不包含实际内容,例如'vector',但有关如何构建vector
的说明。每次我们构建#include
<vector>
的源文件时,如果我们使用不同的模板参数实例化vector
,编译器必须多次构建新的vector
代码
每个源文件的构建都是独立的,并且不知道您是否已经为另一个源文件构建了vector
,因此每次都会构建一个新文件。