我想知道如果编译器实例化模板函数(或类模板的方法)会发生什么。请看以下(无意义)示例:
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上做一些考虑其实际类型的事情。中间的代码不是特定于类型的。现在我这样做:
DoSomething<int>(1);
DoSomething<double>(1);
AFAIK这会导致编译器在编译时将模板实例化两次,这意味着它会创建两者的副本,特定于类型的代码和非特定于类型的代码。但是,非类型特定代码不需要复制,因为它独立于T。
我应该手动优化它,在单独的函数中移动与类型无关的代码,还是在C ++标准或编译器优化器(特别是VS)中有什么东西可以依赖?
编辑: 关于优化......我知道时间与内存的权衡。我假设大多数优化器都试图根据它们的设置来平衡两者。我的问题主要是关于大部分类型无关代码和一个小类型特定部分,可能额外的调用会很好。
答案 0 :(得分:3)
与任何性能和优化问题一样,获得明确答案的唯一方法是同时实施,分析和比较结果。
不过,我会说你认为“优化”可能并不是唯一的。优化者现在做的一个非常重要的优化是调用内联 - 这正是您想要做的相反。通常,通过将函数体复制到调用站点并消除函数调用开销来提高性能。当然,这会导致大量的代码倍增,但优化者知道什么时候这很重要。大多数情况下,代码大小的增加根本不会影响性能。
答案 1 :(得分:1)
您应该查看编译器编译的程序集,以了解正在执行的操作。
话虽如此,很可能是类型无关代码生成一个独立的可重用包,所以无论成本或利润如何,将它放在一个单独的函数中可能是有意义的。