[英]Reconfiguring C++ code to deal with `warning: unsequenced modification and access to parameter`
我在编译的库中有几行代码,它们在clang(OSX)下抛出警告,如下所示:
warning: unsequenced modification and access to 'tmp' [-Wunsequenced]
float tmp, fCosSqr = (tmp = cos(m_angle)) * tmp;
^ ~~~
这行代码看起来非常讨厌,我发现很难确定发生了什么。
据我fCosSqr
, fCosSqr
的最终值应该是cos(m_angle)^2
,并且tmp
的最终值应该是cos(m_angle)
(尽管实际上tmp
不会在程序中的任何其他位置使用) 。)
据推测,提供警告是因为如果分配不按顺序进行,则可以使用tmp
的未初始化值而不是cos(m_angle)
。
我可以按如下方式重写代码行:
float tmp = cos(m_angle), fCosSqr = tmp * tmp;
或者像这样:
float fCosSqr = cos(m_angle) * cos(m_angle);
?
为什么代码编写得如此? 它应该提供某种速度增益吗?
没有充分的理由按原样编写代码。 只要纠正它,并向首先写下它的人发出严厉的抱怨。 这一点并确保审查来自同一个开发人员的任何类似的破坏代码,因为该库可能充满了像这样的错误。
请注意,您提供的第二种方法可能会产生一些额外费用。 除非编译器能够证明cos
是纯函数(即具有相同参数的多个请求将产生相同的精确结果),否则它将不得不调用cos
两次。 添加临时保存中间值是好的,在同一行中定义多个变量并不是那么好,原始代码中的未定义行为是一个可怕的选择。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.