exponenta event banner

Дорогостоящая локальная копия переменной

Локальная переменная создается путем копирования из 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++
По умолчанию: Откл.
Синтаксис командной строки: EXPENSIVE_LOCAL_VARIABLE
Воздействие: среднее
Представлен в R2021a