PVS Studio 6.17 (Windows 7, 64Bit, 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;
}
Предупреждение от студии PVS есть
V821 Снижение производительности. Переменная ‘rhs’ может быть создана в области более низкого уровня.
поскольку s
это std::stack
тип, и соответствующий алгоритм требует, чтобы rhs
-элемент выталкивается из стека, похоже, что PVS-Studio не так. Я что-то пропустил?
Кстати:
В PVS Studio есть опечатка:
perfomance->performance
Ссылка
В комментариях обсуждаются способы оптимизации кода. Да, это можно оптимизировать, хотя, я думаю, в этом нет практически никакого смысла. Если вам придется использовать C ++ — 03, то из-за оптимизации код станет сложным для понимания, что плохо. Ну, конечно, было бы целесообразно использовать std :: move.
Теперь, говоря о PVS-Studio. Анализатор не прав, выдает здесь предупреждение. Невозможно просто взять и переместить переменную rhs
создавая внутри if
-объем. Анализатор не учел, что источник данных изменится и s.top()
вернул бы другое значение. Что ж, диагностика V821 является новой и есть недостатки. Мы постараемся убрать такого рода ложные срабатывания. Спасибо за приведенный пример, а также за информацию о опечатке со словом «производительность».
Других решений пока нет …