我自动生成 C 代码来计算大型表达式,并尝试通过简单的示例来弄清楚在单独的变量中预定义某些子部分是否有意义。
举一个简单的例子,假设我们计算以下形式的内容:
#include <cmath>
double test(double x, double y) {
const double c[9][9] = { ... }; // constants properly initialized, irrelevant
double expr = c[0][0]*x*y
+ c[1][0]*pow(x,2)*y + ... + c[8][0]*pow(x,9)*y
+ c[1][1]*pow(x,2)*pow(y,2) + ... + c[8][1]*pow(x,9)*pow(y,2)
+ ...
所有 c[i][j] 均已正确初始化。实际上,这些表达式包含数千万次乘法和加法。
一位同事现在提议——为了减少对 pow() 的调用次数并缓存表达式中经常需要的值——在一个单独的变量中定义 x 和 y 的每个幂,这没什么大不了的,因为代码是自动的无论如何生成,像这样:
double xp2 = pow(x,2);
double xp3 = pow(x,3);
double xp4 = pow(x,4);
// ...
// same for pow(y,n)
然而,我认为这是不必要的,因为编译器应该处理这些优化。
不幸的是,我没有阅读和解释汇编的经验,但我想我看到所有对 pow() 的调用都被优化了,这是对的吗?另外,编译器是否缓存 pow(x,2)、pow(x,3) 等的值?
预先感谢您的意见!