繁体   English   中英

重新配置C ++代码以处理`警告:无序修改和访问参数`

[英]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;
                              ^                 ~~~

这行代码看起来非常讨厌,我发现很难确定发生了什么。

据我fCosSqrfCosSqr的最终值应该是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM