模板和内联 - 优化乘法

时间:2013-03-20 18:49:02

标签: c++ templates optimization inline-assembly

我不明白我遇到的这个例子:

int Multiply(int x, int m){
    return x * m;}

template<int m>
int MultiplyBy(int x){
    return x * m;}

int a,b;
a = Multiply(10,8);
b = MultiplyBy<8>(10);
     

在上面的例子中,模板功能比简单快   函数,因为编译器知道它可以乘以。的幂   2通过使用换档操作。 x * 8被x&lt;&lt;&lt; ,是的   快点。在简单函数的情况下,编译器不知道   m的值因此无法进行优化除非   功能可以内联

据我了解,模板可以优化的原因是编译器在编译时知道参数(8)的值,而简单函数在运行之前不知道x(或m)的值时间。那么内联简单函数如何改变这一事实呢?内联不提供参数值的任何运行时知识??

2 个答案:

答案 0 :(得分:4)

  

内联不提供参数值的任何运行时知识??

内联本身没有。但是,由于第二个参数是编译时常量,编译器可以将该常量传播到内联函数中。

由于第一个参数也是编译时常量,整个

a = Multiply(10,8);

可以替换为

a = 80;

实际上,这正是我的编译器(gcc 4.7.2)在启用优化时的作用。

答案 1 :(得分:2)

a = Multiply(10,8);

让我们手动内联函数调用:

a = 10 * 8;

现在,当然8是编译时常量,因此编译器可以使用所描述的位移优化。但是,它可能会执行更好的优化,只需将10 * 8替换为80。编译器非常聪明 - 给定一个常量表达式,例如10 * 8,它们可以在编译时计算出结果。

如果你这样做会有所不同:

int x;
std::cin >> x;
a = Multiply(10,x);

如果你在这里内联Multiply,你会得到:

int x;
std::cin >> x;
a = 10 * x;

编译器在编译时不知道x的值,因此无法以相同的方式对其进行优化。