重新配置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;
^ ~~~
这行代码看起来很糟糕,我发现很难完全确定发生了什么
据我所见,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
两次。添加临时值来保持中间值是好的,在同一行中定义多个变量不是很好,原始代码中未定义的行为是一个可怕的选择。
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- CMake-按正确顺序将项目与C运行时对象文件链接
- 函数调用中参数的顺序重要吗
- 为什么不;名字在地图上是按顺序排列的吗
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 数到第n个楼梯的路(顺序无关紧要)
- 优先顺序:智能指针和类析构函数
- 在循环中按顺序遍历成员变量
- 独立读取-修改-写入顺序
- 内存排序或读取-修改-写入操作,仅(读/写)内存顺序
- 有了memory_order_relaxed,原子变量的总修改顺序如何在典型体系结构上得到保证
- 如何修改函数以按C++的排序顺序插入每个项目
- 修改顺序是否有助于发生在关系之前
- Python是否以错误的顺序删除了swip?可以修改吗?
- 使用gcc插件修改变量声明的顺序
- 重新配置C++代码以处理“警告:未按顺序修改和访问参数”
- 如何使用 cocoapods 修改编译顺序
- C++通过引用修改函数中的结构值(可能存在编译顺序问题)
- 修改TestAssert.h (cppunit)——为什么包含的顺序对宏展开很重要
- 非原子对象在所有线程中都有相同的修改顺序吗?(在没有数据竞赛的情况下)