【问题标题】:C++ Templates and Memory AllocationC++ 模板和内存分配
【发布时间】:2019-04-26 19:31:09
【问题描述】:

我被问到正确或错误的问题:

“编译器一遇到函数模板定义就在内存中创建一个函数模板的实例”。

我对模板的理解是编译器在读取函数定义的时候会生成必要的代码。我不确定内存分配。这是真的还是假的?

【问题讨论】:

  • 这是一个措辞不当且模棱两可的问题。谁的记忆?编译器的还是程序的?
  • 原则上,在您知道模板参数的第一次使用(可能是显式实例化)之前,您不会实例化模板。但是这个问题因谈论记忆而令人困惑。也许它在询问编译器是否需要“记住”模板,它可能会这样做。但是“实例”这个词让我相信这是在询问实例化。在任何情况下,看到一个函数模板定义并不足以生成一个实际的函数。你需要它的模板参数。
  • @RichardHodges 我希望我有更多的信息。这就是我得到的全部。我假设程序的内存,但没有更多的上下文。
  • @FrançoisAndrieux 感谢您的澄清。我倾向于虚假。我相信这个问题的目的是实现编译器只在模板传递参数时生成必要的代码/分配内存,而不是在找到定义时。我很困惑,因为它提到了内存分配,我不知道它是如何在模板中发挥作用的。

标签: c++ templates memory compilation


【解决方案1】:

为了清楚起见:

模板不是代码。它是生成代码的秘诀。该代码是在其他代码第一次使用模板生成的代码时生成的。

因此,模板函数只有在其他代码使用它(调用它或获取它的地址)时才成为实际函数。

函数模板定义是如何在函数中编写代码的秘诀。

如果我们假设“内存”,提问者的意思是“程序代码所在的(可能是虚拟的)存储”,那么我想我会回答 false

这是因为函数不是在编译器遇到函数模板定义时编写的,而是在其他代码第一次使用时编写的。

【讨论】:

    猜你喜欢
    • 2011-02-12
    • 1970-01-01
    • 2011-08-23
    • 2014-08-19
    • 2021-11-29
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多