【问题标题】:differences in compiling normal/template functions, c++编译普通/模板函数的差异,C++
【发布时间】:2011-09-22 13:46:19
【问题描述】:

我在教程中读到了这个:

原来C++并没有直接编译模板函数。 相反,在编译时,当编译器遇到对 模板函数,它复制模板函数并替换 具有实际类型的模板类型参数

虽然它与常规(非模板化)函数相同。 我试图了解编译器如何处理这两种函数,以及 主要区别在哪里。 谢谢!

【问题讨论】:

    标签: c++ templates function


    【解决方案1】:

    虽然它与常规(非模板化)函数相同。

    没有。大多数编译器在编译(非static)函数时,只会为该函数发出目标代码(它们稍后可能会在进行全程序优化时更改,但并非所有编译器都这样做)。这不适用于模板函数,因为(a)它们可能不包含足够的信息来发出所有目标代码,并且(b)它们可能接受无限数量的可能值作为其模板参数,因此编译器必须编译无限数量的功能。

    考虑

    template <typename T>
    T add1(T x)
    {
        return x + 1;
    }
    

    此模板函数可以应用于定义了operator+ 的任何类型T,并且可以接受int 参数,并且由于您可以通过运算符重载自己创建此类类型,因此它们的数量可能是无限的.

    相反,在编译时,当编译器遇到对模板的调用时 函数,它复制模板函数并替换模板类型 具有实际类型的参数

    ...但是链接器会注意到,如果您在多个模块中对相同类型的T(例如float)使用add1,则编译的目标代码在每种情况下都是相同的,并且将删除重复项。

    【讨论】:

      猜你喜欢
      • 2021-12-30
      • 1970-01-01
      • 2021-04-29
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      • 1970-01-01
      • 1970-01-01
      • 2011-10-03
      相关资源
      最近更新 更多