2017-09-05 70 views
0

PVS工作室6.17来构造(Windows 7中,64位,VS2017,C++ - 03)似乎给一个错误警告上以下降为代码错误肯定警告PVS Studio:V821性能下降。在“RHS”变量可以在一个较低的水平范围

#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; 
} 

从该警告PVS工作室是

V821性能下降。 'rhs'变量可以在较低级别的范围内构建。

由于sstd::stack类型,并且相应的算法要求从堆栈中弹出rhs -element,所以它看起来像PVS-Studio是错误的。我错过了什么?

顺便说一句:

有一个在PVS工作室消息一个错字:

perfomance->performance 

参考

+1

也许PVS正在讨论'rhs'开始只有在'fred(lhs)'为真时才使用。即使你不能改变(你真的不能吗?)我会认为这是一个真正的积极的 – user463035818

+1

我不确定你希望从中得到什么样的答案。您可能会稍微重新排列代码,并可能会更改警告,但最终可能并不重要。甚至他们的文件谈判的误报。 https://www.viva64.com/en/w/V821/ –

+1

你可以std ::移动rhs和lhs,因为你之后立即弹出它们。它会避免复制。 –

回答

2

在代码优化的意见的方式是讨论。是的,它可以优化,但我认为它几乎没有任何意义。如果你必须使用C++ - 03,那么由于优化,代码将变得很难理解,这很糟糕。那么,当然,使用std :: move会比较合适。

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

相关问题