C++ 假阳性警告PVS Studio:V821性能下降。';rhs&x27;变量可以在较低级别的范围内构造

C++ 假阳性警告PVS Studio:V821性能下降。';rhs&x27;变量可以在较低级别的范围内构造,c++,static-code-analysis,false-positive,pvs-studio,C++,Static Code Analysis,False Positive,Pvs Studio,PVS Studio 6.17(Windows 7,64位,VS2017,C++-03)似乎在以下简化代码上给出了错误的警告 #include <stack> #include <string> #include <vector> bool fred(const std::string &x) { return x == "ab"; } std::vector<std::string> bar(std::stack<std::

PVS Studio 6.17(Windows 7,64位,VS2017,C++-03)似乎在以下简化代码上给出了错误的警告

#include <stack>
#include <string>
#include <vector>
bool fred(const std::string &x)
{
    return x == "ab";
}
std::vector<std::string> bar(std::stack<std::string> & s)
{
    std::vector<std::string> v;
    const std::string rhs(s.top()); // V821 Decreased perfomance. The 'rhs' variable can be constructed in a lower level scope.
    s.pop();
    const std::string lhs(s.top());
    s.pop();

    if (fred(lhs))
    {
        v.push_back(rhs);
    }
    return v;
}
参考文献


    • 在注释中,讨论了代码优化的方法。是的,它可以优化,但是,我认为它实际上没有任何意义。如果必须使用C++-03,那么由于优化,代码将变得难以理解,这是不好的。当然,使用std::move是合适的


      现在,说到PVS-Studio。分析器不正确,在这里发出警告。在
      if
      -范围内创建变量
      rhs
      是不可能的。分析器没有考虑到数据源将发生变化,并且
      s.top()
      将返回另一个值。嗯,V821诊断是新的,并且有缺点。我们将设法消除这种误报。感谢您给出的示例,也感谢您提供有关打字错误的信息,“性能”一词。注释中讨论了优化代码的方法。是的,它可以优化,但是,我认为它实际上没有任何意义。如果必须使用C++-03,那么由于优化,代码将变得难以理解,这是不好的。当然,使用std::move是合适的


      现在,说到PVS-Studio。分析器不正确,在这里发出警告。在
      if
      -范围内创建变量
      rhs
      是不可能的。分析器没有考虑到数据源将发生变化,并且
      s.top()
      将返回另一个值。嗯,V821诊断是新的,并且有缺点。我们将设法消除这种误报。感谢您给出的示例,以及关于“性能”一词输入错误的信息。

      可能PVS指的是
      rhs
      begin仅在
      fred(lhs)
      为真时使用。即使你不能改变这一点(你真的不能改变吗?)我会认为这是真的,我不确定你希望从中得到什么答案。您可能会稍微重新排列代码,它可能会更改警告,但最终可能无关紧要。甚至他们的文档也在谈论假阳性。您可以std::移动rhs和lhs,因为您会立即弹出它们。它可以避免复制。@ratchetfreak:我用的是C++-03。没有std::move。您仍然可以执行
      std::string rhs;std::swap(rhs,s.top())作为实际移动的替代。可能PVS指的是
      rhs
      begin仅在
      fred(lhs)
      为真时使用。即使你不能改变这一点(你真的不能改变吗?)我会认为这是真的,我不确定你希望从中得到什么答案。您可能会稍微重新排列代码,它可能会更改警告,但最终可能无关紧要。甚至他们的文档也在谈论假阳性。您可以std::移动rhs和lhs,因为您会立即弹出它们。它可以避免复制。@ratchetfreak:我用的是C++-03。没有std::move。您仍然可以执行
      std::string rhs;std::swap(rhs,s.top())作为实际移动的替换。
      
         perfomance->performance