【问题标题】:Type independent code in templates在模板中键入独立代码
【发布时间】:2015-03-26 16:58:42
【问题描述】:

我想知道如果编译器实例化模板函数(或类模板的方法)会发生什么。看下面的(无意义的)例子:

template <typename T> T DoSomething(T t)
{
   int i = ToInt<T>(t);
   string s = ToString<T>(t);

   cout << i << endl;
   // ... some more non-type specific code
   cout << s << endl;

   return DoLast<T>(t);
}

只有前两行和最后一行在考虑到 T 的实际类型的情况下对 T 做一些事情。之间的代码不是特定类型的。现在我这样做:

DoSomething<int>(1);
DoSomething<double>(1);

AFAIK 这会导致编译器在编译时两次实例化模板,这意味着它会创建类型特定代码和非类型特定代码的副本。但是,非类型特定的代码不需要复制,因为它独立于 T。

我应该手动优化它,将与类型无关的代码移动到一个单独的函数中,还是在 C++ 标准或编译器优化器(尤其是 VS)中有什么我可以依赖的东西?

编辑: 关于优化......我知道时间与内存的权衡。我假设大多数优化器都试图根据他们的设置来平衡两者。我的问题主要是关于大部分类型独立代码和一小部分特定于类型的部分,可能额外调用会很划算。

【问题讨论】:

  • 你怎么知道这样做是一种“优化”?我想你必须对它进行基准测试。这是了解的唯一途径。
  • 你的意思是什么优化?记忆还是时间?
  • 整个函数体将被实例化两次,所以是的,将非特定类型的代码放在它自己的函数中是一种很好的做法。都是为了编译时间和二进制大小。
  • @Wojciech:查看我的编辑。

标签: c++ templates optimization instantiation


【解决方案1】:

与任何性能和优化问题一样,为您的案例获得明确答案的唯一方法是实现两者,分析并比较结果。

不过,我想说的是,您认为的“优化”实际上可能不是一个。如今,优化器所做的一项非常重要的优化是调用内联——这正是你想要做的相反。通常,通过将函数体复制到调用站点并消除函数调用开销,可以提高性能。当然,这会导致大量代码倍增,但优化人员知道这在什么时候很重要。大多数时候,代码大小的增加根本不会影响性能。

【讨论】:

  • 我明白了。假设与类型无关的代码部分相当大......优化器通常能够减少相乘的代码吗?如果这是从模板生成的代码,对优化器有影响吗?
  • @Silicomancer 恐怕这超出了我对最先进优化技术的了解。
【解决方案2】:

您应该查看编译器编译的程序集以了解正在执行的操作。

话虽如此,与类型无关的代码很可能会产生一个独立的可重用包,因此无论如何将它放在一个单独的函数中可能是有意义的,无论成本或利润是多少。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-18
    • 2011-07-14
    • 2021-08-27
    • 2011-06-28
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多