C++ 重新配置C++;处理“警告:未排序的修改和参数访问”的代码`
我正在编译的库中有几行代码,它们会发出警告(在OSX上),如下所示: 这一行代码看起来很糟糕,我发现很难绝对确定到底发生了什么 据我所知,C++ 重新配置C++;处理“警告:未排序的修改和参数访问”的代码`,c++,refactoring,warnings,C++,Refactoring,Warnings,我正在编译的库中有几行代码,它们会发出警告(在OSX上),如下所示: 这一行代码看起来很糟糕,我发现很难绝对确定到底发生了什么 据我所知,fCosSqr的最终值应该是cos(m_角度)^2,而tmp的最终值应该是cos(m_角度)(尽管实际上tmp在程序的其他任何地方都没有使用) 可能会提供警告,因为如果赋值顺序不正确,则可以使用tmp的未初始化值,而不是cos(m_角度) 我可以把这行代码重写如下: float tmp = cos(m_angle), fCosSqr = tmp * tmp;
fCosSqr
的最终值应该是cos(m_角度)^2
,而tmp
的最终值应该是cos(m_角度)
(尽管实际上tmp
在程序的其他任何地方都没有使用)
可能会提供警告,因为如果赋值顺序不正确,则可以使用tmp
的未初始化值,而不是cos(m_角度)
我可以把这行代码重写如下:
float tmp = cos(m_angle), fCosSqr = tmp * tmp;
或者像这样:
float fCosSqr = cos(m_angle) * cos(m_angle);
?
为什么代码一直是这样写的?它应该提供某种速度增益吗?没有很好的理由按原样编写代码。只要纠正它,并向最初写它的人提出严厉的抱怨。并且一定要检查来自同一个开发人员的任何类似的错误代码,因为库可能会被类似的错误所困扰
注意,您提供的第二种方法可能会产生一些额外的成本。除非编译器能够证明
cos
是一个纯函数(即具有相同参数的多个请求将产生相同的精确结果),否则它必须调用cos
两次。添加临时值来保存中间值是好的,在同一行中定义多个变量不是很好,原始代码中未定义的行为是一个可怕的选择。另一种可能是(内联)函数,float fCosSqr=square(cos(m_角))代码>。那么就不需要命名的临时文件了。
float fCosSqr = cos(m_angle) * cos(m_angle);