模板和内联优化乘法
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
的值,因此无法以相同的方式对此进行优化。
相关文章:
- 空基优化子对象的地址
- 关闭||运算符优化
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 返回值优化:显式移动还是隐式
- 人脸跟踪arduino代码的优化
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 纯函数,为什么没有优化
- 为什么大多数 pair 实现默认不使用压缩(空基优化)?
- 如何以优化的方式同时迭代两个间距不相等的数组
- 小字符串优化(调试与发布模式)
- 浮点定向舍入和优化
- Visual Studio 调试优化如何工作?
- 为什么开关的优化方式与 c/c++ 中的链接不同?
- 线性优化目标函数中的绝对值
- GCC 会优化内联访问器吗?
- gcc 如何优化此循环?
- 如何防止 CUDA-GDB 中的<优化输出>值
- 为什么我的程序在 O0 和 O2 的优化级别返回不同的结果
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- 使用 std::p air 进行返回值优化