exponenta event banner

Константа std::move ввод может привести к более дорогой копии объекта

Константа std::move ввод не может быть перемещен, что приводит к более дорогостоящей операции копирования

Описание

Этот дефект возникает при использовании std::move на const объект, что приводит к более дорогостоящей операции копирования.

Средство проверки вызывает нарушение только для типов классов с нетривиальной операцией копирования и операцией перемещения.

Риск

A const объект не может быть изменен и поэтому не может быть перемещен. Один std::move на const объект бесшумно возвращается к операции копирования без ошибок компиляции. Ваш код может пострадать от снижения производительности, не заметив проблемы.

Зафиксировать

Удалить const квалификатор перемещаемого объекта.

Если требуется выполнить операцию копирования, удалите резервную std::move звоните.

Обратите внимание, что эта проблема также вызывает проверку Move operation on const object, что относится ко всем операциям перемещения на const объекты независимо от того, имеет ли тип класса операцию перемещения и нетривиальную операцию копирования. Если вы решите обосновать проблему, вы можете использовать одно и то же обоснование для обоих результатов.

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

Примеры

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

#include <string>

#include <string>

class MyClass {
public:
    void setName( const std::string& name ) {
        m_name = std::move( name );
    }
private:
    std::string m_name;
};

В этом примере: std::move вызывается в const объекты, name. Вместо присвоения перемещения происходит возможно более дорогостоящее присвоение копии.

Удалить const Определители

Если требуется переместить операции, удалите const квалификатор из определений перемещаемых объектов.

#include <string>

#include <string>

class MyClass {
public:
    void setName( std::string& name ) {
        m_name = std::move ( name );
    }
private:
    std::string m_name;
};

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

Группа: Производительность
Язык: C++
По умолчанию: Откл.
Синтаксис командной строки: EXPENSIVE_STD_MOVE_CONST_OBJECT
Воздействие: среднее
Представлен в R2020b