【发布时间】: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