在模板中键入独立代码
Type independent code in templates
我想知道如果编译器实例化一个模板函数(或类模板的方法)会发生什么。看看以下(毫无意义的)例子:
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)中有我可以依赖的东西?
编辑:关于优化。。。我知道时间和记忆之间的权衡。我想大多数优化器都会根据它们的设置来平衡两者。我的问题主要是关于与类型无关的代码的大部分和特定于类型的小部分,其中可能需要额外的调用。
与任何性能和优化问题一样,为您的案例获得明确答案的唯一方法是实现这两个问题,分析并比较结果。
不过,我想说的是,你所认为的"优化"实际上可能不是一个。优化器目前所做的一项非常重要的优化是调用内联—这正是你想要做的的反面。通常,通过将函数体复制到调用站点并消除函数调用开销,可以提高性能。当然,这会导致大量的代码乘法,但优化器知道什么时候这很重要。大多数情况下,代码大小的增加根本不会影响性能。
您应该查看编译器编译的程序集,以了解正在执行的操作。
话虽如此,与类型无关的代码很可能会成为一个独立的可重复使用的包,所以不管成本或利润如何,把它放在一个单独的函数中可能是有意义的。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 来自C++代码的独立可执行文件
- 在没有额外代码的情况下链接两个独立类的最通用方法是什么?
- 将C 代码编译到独立应用程序.App
- 尝试从Octave的独立程序示例中编译示例代码,在第一行出现段错误
- 在独立的 Xcode 操场中运行 c 或 c++ 代码
- G -FPIC不产生位置独立代码
- DBUS 代码在放置在守护进程内时崩溃,但在没有守护进程代码的独立独立 main() 函数中运行良好
- 在模板中键入独立代码
- 这C++代码的安全性和独立于编译器的程度
- 生成独立C++代码的分析器生成器
- 派生运行独立代码的子级和父级
- 在一个独立的C++程序中编译用C++编写的Festival代码的部分
- 使用Visual Studio express 2013为c++代码创建独立的可执行文件
- 为什么简单的mysql++代码编译独立,而不是在项目
- 如何使此代码中的线程独立运行
- 使用Java原生代码或C++(QT,WxWidgets等)进行独立于平台的编程
- 是否可以将C++/MEX(Matlab)代码转换为独立C++
- 独立代码生成不支持函数'uigetfile'