关于ZAKER 融媒体解决方案 合作 加入

c- 在模板中输入独立代码

CocoaChina 11-12

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

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 ) 中的任何东西?

编辑:

关于优化…我知道时间与内存之间的权衡 . 我认为大多数优化程序都会尝试根据其设置来平衡两者 . 我的问题主要是关于类型独立代码的很大一部分和特定于类型的小部分 , 其中可能需要进行额外的调用 .

最佳答案

与任何性能和优化问题一样 , 要针对您的情况确定答案 , 唯一的方法是同时实施 , 分析和比较结果 .

不过 , 我要说的是 , 您认为的 " 优化 " 实际上可能不是一个 . 如今 , 优化器所做的非常重要的优化之一就是内联 , 这恰恰与您想要做的相反 . 通常 , 通过将功能主体复制到调用站点并消除功能调用开销来提高性能 . 当然 , 这会导致大量的代码乘法 , 但是优化人员知道何时需要这样做 . 大多数时候 , 代码大小的增加根本不会影响性能 .

以上内容由"CocoaChina"上传发布 查看原文
相关标签 代码