我正在编译的库中有几行代码,它们在clang(OSX)下抛出警告,如下所示:
warning: unsequenced modification and access to 'tmp' [-Wunsequenced]
float tmp, fCosSqr = (tmp = cos(m_angle)) * tmp;
^ ~~~
这行代码看起来非常讨厌,我发现很难确定发生了什么。
据我所知,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);
为什么代码编写得如此?它应该提供某种速度增益吗?
答案 0 :(得分:3)
没有充分的理由按原样编写代码。只要纠正它,并向首先写下它的人发出严厉的抱怨。这一点并确保审查来自同一个开发人员的任何类似的破坏代码,因为该库可能充满了像这样的错误。
请注意,您提供的第二种方法可能会产生一些额外费用。除非编译器能够证明cos
是纯函数(即具有相同参数的多个请求将产生相同的精确结果),否则它将不得不两次调用cos
。添加临时保存中间值是好的,在同一行中定义多个变量并不是那么好,原始代码中的未定义行为是一个可怕的选择。