存储三角函数调用的结果是否有意义
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)
);
- 每种情况的利弊是什么?
- 编译器是否优化了第二个示例中的开销?或者,即使在
vector2D
库的情况下,多次调用trig函数的开销也是微不足道的?
第一个版本可能是编译器在优化第二个版本时生成的代码。
一些编译器可能知道 sin
和 cos
是纯函数,它们始终为特定参数返回相同的值。但是语言标准对此没有任何说明,所以我们不能确定。
此外,在尝试这样的本地优化之前,您可能会问自己,调用此函数的频率是否足以成为应用程序中的瓶颈。如果没有,也许不会注意到确切的速度差异。
gcc 编译器将 sin 和 cos 映射到 __builtin_sin
和 __builtin_cos
,因此它对这些函数有额外的了解,但我不知道优化器是否利用了这一点。
您还可以
为 vector.x - origin.x
和 vector.y - origin.y
定义变量。如前所述,这不是性能问题,因为编译器无论如何都会实现这些优化,而是代码可读性的问题。
如果创建这些附加变量,则还应将它们声明为 const
,因为您不打算更改它们的值。
关于使用这些"冗余"变量有不同的意见。如果我能为它们找到一个有意义的名字,我个人会使用它们。
相关文章:
- 为什么这个程序的结果是3 "born"?和 4 死
- 分配给浮点数的积分文字除法 - 为什么结果是错误的?
- C++初始化的结果是什么?
- 我的输出结果是 0 英寸C++.可能是什么问题
- 使用std::tie进行类似golang的错误处理,同时返回结果,是否有缺点?(C++11)
- 在C++中使用 fread() 来解释这个结果是什么?
- 为什么双算的结果是错误的?
- 为什么一个简单的C++程序会有错误的结果?是 #define 引起的吗?
- 在运行libtorch的模型时获得的结果是不正确的,该模型经过训练并从Pytorch出口
- 是迭代器增量结果是新的迭代器
- 结果是不同的;C++ 中的 recv(sock,buf,sizeof(buf),0) 和 strlen(buf)
- 非常量表达式的左值到右值转换的结果是常数吗?
- 将Execl命令的结果(是目录列表)输送到父进程
- 如果我将未签名的int添加到负int且算术结果是正面的,会发生什么
- decltype( (A{}.int_member) 的正确结果是什么)
- 当我们在int上进行操作时,结果是暂时存储在int中的结果
- 大端序中的以下代码的结果是什么
- 并发::when_all的结果是 FIFO 吗?
- 递归宏点差的结果是什么
- static_casting constexpr void* 的结果是常量表达式吗?