模板和内联优化乘法

Templates and inlining- optimizing multiplication

本文关键字:优化      更新时间:2023-10-16

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

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,哪个是更快。在简单函数的情况下,编译器不知道m的值,因此不能进行优化,除非函数可以内联

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

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

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

由于第一个参数也是编译时间常数,因此整个

a = Multiply(10,8);

可以用代替

a = 80;

事实上,这正是我的编译器(gcc 4.7.2(在启用优化时所做的。

a = Multiply(10,8);

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

a = 10 * 8;

现在,8当然是这里的编译时间常数,所以编译器可以使用所描述的位偏移优化。然而,它可能会执行更好的优化,并仅用80替换10 * 8。编译器非常聪明——给定一个常量表达式,例如10 * 8,他们可以在编译时计算出结果。

如果你做到了,那就不一样了:

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

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

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

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