在模板中键入独立代码

Type independent code in templates

本文关键字:独立 代码      更新时间:2023-10-16

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

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)中有我可以依赖的东西?

编辑:关于优化。。。我知道时间和记忆之间的权衡。我想大多数优化器都会根据它们的设置来平衡两者。我的问题主要是关于与类型无关的代码的大部分和特定于类型的小部分,其中可能需要额外的调用。

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

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

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

话虽如此,与类型无关的代码很可能会成为一个独立的可重复使用的包,所以不管成本或利润如何,把它放在一个单独的函数中可能是有意义的。