【发布时间】:2011-04-07 17:54:03
【问题描述】:
大型模板项目编译速度很慢,从经验证据看来,STL 是造成这种情况的主要罪魁祸首。但是,为什么编译慢?
我之前通过观察头文件包含和组合编译单元来优化构建,但我不明白为什么模板库编译起来如此缓慢。
【问题讨论】:
标签: c++ templates code-generation compilation
大型模板项目编译速度很慢,从经验证据看来,STL 是造成这种情况的主要罪魁祸首。但是,为什么编译慢?
我之前通过观察头文件包含和组合编译单元来优化构建,但我不明白为什么模板库编译起来如此缓慢。
【问题讨论】:
标签: c++ templates code-generation compilation
由于古老的包含机制,C++ 通常编译速度很慢,这会导致编译器递归地重新解析每个标头及其所有声明和定义以及每个翻译单元所包含的所有内容。
模板只是建立在该“功能”之上。但是它们也要求所有代码都在标头中,这迫使编译器也重新解析所有包含的模板的所有实现。
【讨论】:
模板代码必须作为另一种语言来生成 C++ 代码。
在这种思路下,模板化的代码必须被解析、执行,然后编译器才能生成C++代码,需要添加到当前的单元文件中,然后我们就可以编译整个C++代码了。
我听说并非所有编译器都完全这样做,但这是主要思想,并且假设在真正编译代码之前还有很多事情要做,因为必须首先生成一些代码。
【讨论】:
部分答案在您的问题中。您不能在模板中查看标头包含,因为完整的实现必须包含在使用它们的每个编译单元中。
【讨论】:
想想真实世界的模板是什么——它不是真实的东西,而是关于如何构建真实事物的指导。
对于 C++ 模板,头文件不包含实际的,例如'vector',但有关如何构建 vector 的说明。每次我们构建#includes <vector> 的源文件时,编译器都必须构建新的vector 代码,如果我们用不同的模板参数实例化vectors,可能会构建多次。
每个源文件的构建都是独立的,不知道你是否已经为另一个源文件构建了vector,所以每次都构建一个新的。
【讨论】: