Expensive local variable copy

Локальная переменная создается копией с const ссылка и не измененный позже

Описание

Этот дефект происходит, когда локальная переменная создается копией с const ссылка, но не измененный позже.

Например, переменная name создается копией с const ссылка возвращена в get_name функция:

const std::string& get_name();
...
void func {
    std::string name = get_name();
}
Дефект повышен, только если локальная переменная имеет нетривиально copyable тип или тривиально copyable тип с размером, больше, чем 2 * sizeof(void *).

Риск

Если переменная создается из const ссылка и не измененная позже, сама переменная может быть задана как const ссылка. Создание const ссылка избегает потенциально дорогой операции копии.

Фиксация

Постарайтесь не создавать новую локальную переменную копией с const ссылка, если вы не намереваетесь изменить переменную позже. Создайте const ссылка вместо этого.

Например, в предыдущем разделе, можно переопределить переменную name как:

const std::string& get_name();
...
void func {
    const std::string& name = get_name();
}

Повышения производительности могут варьироваться на основе компилятора, реализации библиотеки и среды, которую вы используете.

Примеры

развернуть все

#include <string>

class Task
{
public:
    // ...
    const std::string& get_name() const;
    // ...
private:
    // ...
};

void inspect( const Task& task )
{
    // ...
    const std::string name = task.get_name(); 
    // ...
}

В этом примере, переменной name создается копией с const ссылка, но не измененный позже.

Коррекция – использует const Ссылка

Чтобы избежать потенциально дорогой операции копии, постарайтесь не создавать новую локальную переменную, если вы не намереваетесь изменить переменную позже. Вместо этого присвойте const- ссылочное возвращаемое значение к другому const ссылка.

#include <string>

class Task
{
public:
    // ...
    const std::string& get_name() const;
    // ...
private:
    // ...
};

void inspect( const Task& task )
{
    // ...
    const std::string& name = task.get_name(); 
    // ...
}

Информация о результате

Группа: Производительность
Язык: C++
Значение по умолчанию: Off
Синтаксис командной строки: EXPENSIVE_LOCAL_VARIABLE
Удар: Средняя
Введенный в R2021a