Expensive local variable copy

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

Описание

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

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

const std::string& get_name();
...
void func {
    std::string name = get_name();
}
Дефект возникает, только если локальная переменная имеет нетривиально копируемый тип или тривиально копируемый тип с размером более 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