【问题标题】:Excess code bloat by function that doesn't use template parameters?不使用模板参数的函数导致多余的代码膨胀?
【发布时间】:2014-12-27 01:06:40
【问题描述】:

我有一个函数 f,它接受一个 Bar 类型的参数,它有 3 个模板参数。 f 不使用这三个参数中的任何一个。问题:编译器是否仍会根据所有使用的 A、B 和 C 组合生成多个版本的 f,还是有更好的方法?

例子:

template<typename A, typename B, typename C>
class Bar;

template<typename A, typename B, typename C>
void f(Bar<A,B,C>& bar)
{
  //code that does not use A, B or C, e.g.:
  std::cout << bar.some_getter() << std::endl;
}

【问题讨论】:

    标签: c++ function templates parameters


    【解决方案1】:

    编译器是否会实际生成不同的代码(或任何单独的代码)将取决于您使用这些函数执行的操作。例如,如果您只是调用函数并且它相当小,编译器可能会完全内联代码,使其可能比最初创建函数时更小。

    另一方面,如果您获取不同实例化的地址,它们将具有不同的地址,也就是说,即使编译器可能共享大部分相同的代码,如果类型相同,它也需要具有不同的地址.我不确定您是否可以比较不同类型的函数指针(随着参数Bar&lt;A, B, C&gt; 的变化,我们的函数将具有不同的类型)。

    请注意,即使 f() 可能不会直接接触任何类型 ABC,但 Bar 在实例化之间可能不同这一事实可能会导致完全 em> 需要不同的代码,而且显然是生成的。

    【讨论】:

    • 当然,调用&amp;f 必须与直接调用f() 执行相同的操作并不意味着这些函数必须相同。编译器可能出于缓存原因决定在直接调用中使用f 的单个版本,但如果您使用&amp;f,则使用重载。这是一种不可预测的假设。
    【解决方案2】:

    编译器将准确生成您最终使用的重载数量 - 如果您的代码最终为 n 组合 (A,B,C) 调用 f&lt;A,B,C&gt;,您将生成 n 重载。没有不必要的膨胀。但是,模板参数推导发生在精确类型上。例如,您可能只有一个函数

    void foo(double x);
    

    让这两个语句都有效

    foo(1);//int implicitly promoted to double
    foo(1.0);
    

    但是,如果你有

    template <typename T>
    foo(T x);
    

    你最终会产生两个重载。

    foo(1);//T is deduced to be int, leading to initialization of foo<int>
    foo(1.0);//T is deduced to be double, leading to initialization of foo<double>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多