存储三角函数调用的结果有意义吗?

Is it meaningful to store the result of a trigonometric function call?

假设我正在编写 vector2D 库的 rotate() 方法的实现。

vector2D rotate(const vector2D vector, const vector2D origin, float radians)
{
    // Implementation details
    return {x, y};
}

我可以将三角函数调用的结果存储在变量中,因此我不必多次调用它们:

float sr = sin(radians);
float cr = cos(radians);
float x = origin.x + (
    (vector.x - origin.x) * cr - (vector.y - origin.y) * sr
);
float y = origin.y + (
    (vector.x - origin.x) * sr + (vector.y - origin.y) * cr
);

或者我可以简单地写下我的意思

float x = origin.x + (
    (vector.x - origin.x) * cos(radians) - (vector.y - origin.y) * sin(radians)
);
float y = origin.y + (
    (vector.x - origin.x) * sin(radians) + (vector.y - origin.y) * cos(radians)
);

第一个版本可能是编译器在优化第二个版本时生成的代码。

一些编译器可能知道 sincos 是纯函数,它们总是 return 特定参数的相同值。但是语言标准对此没有任何说明,所以我们不能确定。

此外,在尝试像这样的局部优化之前,您可能会问自己,此函数的调用频率是否足以成为应用程序的瓶颈。如果没有,可能不会注意到确切的速度差异。

gcc 编译器将 sin 和 cos 映射到 __builtin_sin and __builtin_cos,因此它对这些函数有额外的了解,但我不知道优化器是否利用了这一点。

您还可以为 vector.x - origin.xvector.y - origin.y 定义变量。如前所述,这不是性能问题,因为编译器无论如何都会实现这些优化,而是代码可读性问题。

如果您创建这些额外的变量,您还应该将它们声明为 const,因为您不打算更改它们的值。

对于使用这些"redundant"变量有不同的看法。如果我能为它们找到一个有意义的名称,我个人会使用它们。