2010-09-03 72 views
6

大型模板项目编译起来很慢,STL是经验证据中的主要元凶。但是,为什么编译起来很慢?为什么模板很慢编译?

我之前通过观察包含头文件和编译单元来优化构建,但是我不明白为什么模板库编译起来相当慢。

回答

4

模板代码必须被视为另一种语言来生成C++代码。

在这种思维方式中,模板化代码必须被解析,执行,然后编译器才能生成必须添加到当前单元文件中的C++代码,然后我们才能编译整个C++代码。

我听说并非所有的编译器都这样做,但这是主要思想,并且假设在编译代码之前还有很多事情要做,因为一些代码必须先生成。

1

部分答案在你的问题中。您无法观察包含模板的头文件,因为完整的实现必须包含在每个使用它们的编译单元中。

12

C++中一般是缓慢的古代,因为编译包括机制,使编译器递归重新解析其所有声明和定义每一个头和所有随机配备每一个翻译单元

模板只是建立在该“功能”上。但是它们要求所有代码也处于标题中,迫使编译器也重新解析包括的所有模板的所有实现

+5

当您对前几次回答投票时,会弹出一个框,要求您解释为什么您这样做。过了一段时间,这不再发生。然而,那并不是因为你不应该再解释回票,而是因为那时你必须知道。大胆地说:__你应该还是解释你为什么投票弃权.__ – sbi 2010-09-03 09:54:35

+0

不确定,但也许是一个C粉丝来过并且认为“古代包含机制很好,C编译得足够快” – jalf 2010-09-03 09:56:33

+0

预编译头文件帮助解决这个问题问题 - 您可以预编译整个STL,以便在编译项目时仅解析一次。 – AshleysBrain 2010-09-03 10:28:35

1

想想现实世界的模板是什么 - 它不是一个实际的东西,而是关于如何构建实际事物的方向。

对于C++模板,头文件不包含实际的,例如, '向量',但是如何建立一个vector。每次我们构建一个源文件时,编译器必须编译新的vector代码,如果我们用不同的模板参数实例化vector,可能需要多次。

每个源文件的构建都是独立的,并且不知道您是否已经为另一个源文件构建了vector,因此它每次都构建一个新文件。