是否在编译时创建了所有模板实例化?

Alw*_*ing 5 c++ templates variadic-templates c++11

在了解了使用递归的可变函数模板之后,我想知道:

是否在编译时创建了程序执行期间可能需要的所有模板实例化?有即时实例化之类的东西吗?

Pet*_*ter 5

模板在将每个已翻译的翻译单元转换为实例化单元的过程中被实例化。

翻译单元本质上是源文件。

翻译后的翻译单元(尝试说快三倍)是在没有实例化模板的情况下编译的输出。

实例化单元本质上是带有实例化模板的已翻译翻译单元。

实例化是否发生在“编译时”取决于实现的体系结构。

在传统的“编译为对象并链接对象”架构(大多数在 Windows 或 Linux 下工作的开发人员都会熟悉的架构)中,翻译后的翻译单元的生成和实例化单元的生成都是编译器的两个阶段(可能是组合阶段)。因此,在这个模型中,实例化是一个编译时活动。

然而,存在使用“智能链接器”的实现,并且编译器输出翻译的翻译单元,以及一些描述每个翻译的翻译单元需要什么模板实例化的辅助信息。然后,将它们转换为实例化单元的过程由链接器处理。通过这样的实现,模板实例化因此是链接时活动而不是编译时活动。此构建模型的目的是为链接时优化提供机会(链接时模板实例化更多的是副作用而不是目标)。

我遇到的第一个智能链接器实现是 Sun Microsystems 在 SunOS 和后来的 Solaris 上作为额外成本选项提供的(这些操作系统默认附带包含更典型的哑链接器的工具链)。从那以后我遇到了其他几个这样的工具链,但一时想不起他们的供应商。

我不知道有任何在运行时发生模板实例化的实现。然而,可以想象,C++ 解释器可能会以这种方式工作。


For*_*veR 1

所有模板实例化都是在编译时创建的。\n引用标准:

\n\n

N4296 2.2/1/8[lex.phases]

\n\n
\n

已翻译的翻译单元和实例化单元按如下方式组合:[注意:其中部分或全部可能由库提供。\n \xe2\x80\x94 尾注]每个已翻译的翻译单元都会经过检查以生成\n所需实例化的列表。[ 注意:这可能包括已明确请求的实例化 (14.7.2)。\xe2\x80\x94 end\n note ] 找到所需模板的定义。包含这些定义的翻译单元的源是否需要可用是由实现定义的。[注意:实现可以将足够的信息编码到翻译的翻译单元中,以确保此处不需要源。\xe2\x80\x94\n 尾注]执行所有必需的实例化以生成\n 实例化单元。[ 注意:这些与翻译的翻译单元类似,但不包含对未实例化模板的引用,也不包含模板定义。\xe2\x80\x94 尾注] 如果任何实例化失败,则程序\n 格式错误。

\n
\n