如果我写
template<int sign>
inline int add_sign(int x) {
return sign * x;
}
template int add_sign<-1>(int x);
template int add_sign<1>(int x);
大多数C ++编译器是否足够聪明,可以将乘法优化1或-1加速到更快的操作(无操作或否定)?
答案 0 :(得分:4)
是。这是一类简单优化的一部分,称为算术局部优化。例如,1 * x
可以静态简化为x
,同样-1 * x
可以简化为-x
。生产编译器都是这样做的,也是更复杂的优化。
答案 1 :(得分:2)
对于g++
,使用g++ -S Foo.cc
查看汇编程序并确定模板是否已经过优化。对于clang
,请查看this question。对于Visual Studio,请查看this question。
答案 2 :(得分:1)
虽然在这种情况下编译器会为您进行优化,但在更复杂的情况下,可能需要为不同的模板参数编写最佳代码的不同变体。因此,您可以使用模板专业化来执行此操作:
template<int sign>
inline int add_sign(int x);
template<>
inline int add_sign<-1>(int x) {
return -x;
}
template<>
inline int add_sign<1>(int x) {
return x;
}
使用这种完全专用的功能,您无需为其编写显式实例。