Конструктор перемещения или оператор присваивания перемещения используют операции копии на базовых классах или элементах данных
Этот дефект повышен, если все эти условия верны:
Конструктор перемещения или оператор присваивания перемещения класса копируют базовый класс или элемент данных.
Операции пересылки для базового класса или элементов данных доступны.
Базовый класс или элементы данных являются более дорогими, чтобы скопировать, чем переместиться.
Например, в этом коде конструктор перемещения копирует элемент данных data
. Polyspace® отмечает операцию копии.
class wrapper{ //... wrapper(wrapper&& rhs): data(rhs.data){ //... } private: std::string data; }
Разработчики часто принимают, что операции пересылки являются более дешевыми, чем операции копии. Они используют операции пересылки при контакте с большими ресурсами, которые являются дорогими, чтобы скопировать. Непреднамеренно не использующие вызовы std::move
может заставить конструктора перемещения или оператор присваивания перемещения копировать элементы данных и базовые классы, делая код неэффективным. Поскольку такие неожиданные операции пересылки скомпилировали и запустили правильно, пропуск стимулирования неэффективности std::move
может затруднить, чтобы обнаружить.
Чтобы зафиксировать этот дефект, используйте std::move
перемещать базовые классы и элементы данных класса. Как лучшая практика, используйте неявного конструктора перемещения по умолчанию и переместите оператор присваивания путем установки их как =default
. Вместо ресурсов сырых данных управления используйте умные контейнеры, чтобы позволить операциям пересылки по умолчанию переместить ресурсы правильно.
Повышения производительности могут варьироваться на основе компилятора, реализации библиотеки и среды, которую вы используете.
Группа: Производительность |
Язык: C++ |
Значение по умолчанию: Off |
Синтаксис командной строки:
MOVE_OPERATION_USES_COPY |
Удар: Средняя |