gpt4 book ai didi

c++ - 所有的模板实例都是在编译时创建的吗?

转载 作者:太空宇宙 更新时间:2023-11-04 13:14:08 24 4
gpt4 key购买 nike

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

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

最佳答案

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

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

翻译的翻译单元(试着说快三倍)是没有实例化模板的编译输出。

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

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

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

但是,有些实现使用“智能链接器”,编译器输出翻译后的翻译单元,以及一些描述每个翻译后的翻译单元需要哪些模板实例化的辅助信息。然后将这些转换为实例化单元的过程由链接器处理。通过这样的实现,模板实例化因此是链接时事件而不是编译时事件。此构建模型的目的是为链接时优化提供机会(链接时模板实例化与其说是目标,不如说是副作用)。

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

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

关于c++ - 所有的模板实例都是在编译时创建的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38279505/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com