模板实际上必须是编译时构造吗?

Lig*_*ica 13 c++ templates

C++标准是否真的要求模板必须在编译时实例化,而不是运行时?

如果不是,我们纯粹使用它是否是一种惯例,因为这样做显然是有道理的?或者是否有一些实际的理由会在理论上阻止现有的可以在运行时实例化模板的实现?

Jam*_*nze 10

所有标准要求是可观察的行为就像模板在程序开始运行之前被实例化一样.例如,任何错误都必须在编译的某个阶段触发消息,或者至少在运行时之前触发消息.从理论上讲,编译器可能会推迟完整实例化直到运行时,但实际上,它必须在编译时完成大部分工作,以确保出现任何潜在的错误消息.

从更严格的意义上讲,该标准将"翻译"视为一个单元; 一个实现可以,并且实现具有(并且我认为一些仍然存在)将实例化推迟到链接时间.当涉及动态链接时,这会产生有趣的问题.但是标准没有提到:动态链接实际上是未定义的行为,就标准而言,因此需要实现.

但是,最终:实例化模板是编译器执行的最昂贵的操作之一,并且需要非常大且复杂的机制.没有供应商想要强制执行可执行文件.所以不管漏洞如何,不要指望很快就能看到编译时实例化.特别是因为它不会为你买任何东西:标准要求所有模板都可以在编译时实例化,因此你不能以某种方式实例化一个模板依赖于运行时参数,仍然是标准的符合.

  • "不要指望看到编译时实例化"`s/compile/run /`? (5认同)

Jon*_*ler 8

您无法在运行时(在运行时)在C++程序中创建类型; 它们在编译时都是已知的.即使动态加载的共享库也不会改变它; 库中的类型集在编译时是已知的(编译库时),并且加载程序必须能够处理库公开的类型.

因此,不需要在运行时进行模板评估; 这些信息在编译时都是已知的.

如果要在运行时实例化模板,则需要编译器和链接器服务作为运行时的一部分.这使得所需的运行时环境变得非常复杂 - 没有明显的优势.

很明显,解释性C++系统可能会推迟模板实例化,直到需要 - JIT(及时)处理.但是编译仍然在代码执行之前完成.

  • GNU建议链接器有一天可能会重新调用带有保存状态的编译器来进行实例化.阅读http://gcc.gnu.org/onlinedocs/gcc/Template-Instantiation.html (2认同)