我不明白我遇到的这个例子:
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)的值时间。那么内联简单函数如何改变这一事实呢?内联不提供参数值的任何运行时知识??
答案 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
的值,因此无法以相同的方式对其进行优化。