﻿# V820\. The variable is not used after copying\. Copying can be replaced with move/swap for optimization\.

Анализатор обнаружил, что переменная не используется после того, как её скопировали в другую переменную\. Такой код можно оптимизировать, избавившись от лишнего копирования\.

Рассмотрим несколько ситуаций\.

Пример 1:

```cpp
class UserInfo
{
  std::string m_name;
public:
  void SetName(std::string name)
  {
    m_name = name;
  }
};
```

В приведённом примере произойдёт два копирования: первое при вызове функции 'SetName\(\)', второе при копировании 'name' в 'm\_name'\. Можно избавиться от копирования, использовав move присвоение:

```cpp
void SetName(std::string name)
{
  m_name = std::move(name);
}
```

Если объект не move assignable, то можно изменить сигнатуру функции 'SetName\(\)', сделав переменную 'name' константной ссылкой\. В таком случае копирование произойдёт только при присваивании\.

```cpp
void SetName(const std::string &name)
{
  m_name = name;
}
```

Пример 2:

```cpp
bool GetUserName(int id, std::string &outName)
{
  std::string tmp;
  if (db->GetUserName(id, tmp))
  {
    outName = tmp;
    return true;
  }
  return false;
}
```

В данном случае есть локальная переменная 'tmp', которая копируется в 'outName' и дальше не используется\. С точки зрения производительности эффективнее использовать 'move' или 'swap'\.

```cpp
bool GetName(int id, std::string &outName)
{
  std::string tmp;
  if (db->GetUserName(id, tmp))
  {
    outName = std::move(tmp);
    return true;
  }
  return false;
}
```

Пример 3:

```cpp
void Foo()
{
  std::vector<UserInfo> users = GetAllUsers();
  {
    std::vector<UserInfo> users1 = users;
    DoSomethingWithUsers1(users1);
  }
  {
    std::vector<UserInfo> users2 = users;
    DoSomethingWithUsers2(users2);
  }
}
```

Иногда копирование можно заменить на ссылку, если вариант с swap/move для какого\-то класса недоступен\. Это может быть не лучшим решением с точки зрения красоты кода, но это будет лучше по производительности\.

```cpp
void Foo()
{
  std::vector<UserInfo> users = GetAllUsers();
  {
    std::vector<UserInfo> users1 = users;
    DoSomethingWithUsers1(users1);
  }
  {
    std::vector<UserInfo> &users2 = users;
    DoSomethingWithUsers2(users2);
  }
}
```