现代编译器将乘法优化为1和-1

时间:2014-03-09 07:39:41

标签: c++ templates compiler-construction compiler-optimization sign

如果我写

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加速到更快的操作(无操作或否定)?

3 个答案:

答案 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;
}

使用这种完全专用的功能,您无需为其编写显式实例。