Переместитесь конструктор не должен инициализировать его члены класса и базовые классы с помощью семантики копии
Переместитесь конструктор не должен инициализировать его члены класса и базовые классы с помощью семантики копии.
На C++ операции пересылки передают владение ресурсов вместо того, чтобы копировать сами ресурсы от исходного объекта до целевого объекта. Поскольку конструкторы перемещения не копируют ресурсы, эти конструкторы быстрее, чем конструкторы копии. Рассмотрите этот код где объект CopyTarget
создается из копии и объект MoveTarget
создается из перемещения из объекта Source
.
class BigData{ //... BigData(BigData&&){ //Move Constructor //... } copy constructed BigData(const BigData&){ //Copy Constructor //... } private: std::map<int, std::string> BigBook; }; int main(){ BigData Source; BigData CopyTarget = Source; BigData Movetarget = std::move(Source); //... }
Когда создающий копию CopyTarget
, компилятор копирует ресурс Source::BigBook
от Source
к CopyTarget
. После конструкции копии оба из этих объектов имеют копию ресурса BigBook
. Когда создающий перемещение Movetarget
, компилятор передает владение ресурса Source::BigBook
к MoveTarget
. Поскольку конструкция перемещения не копирует ресурс физически, это быстрее, чем конструкция копии.
Конструкция перемещения является стратегией оптимизации. Вы ожидаете, что конструкция перемещения является более дешевой и быстрее, чем конструкция копии. Инициализирующие копию элементы данных и базовые классы могут сделать конструктора перемещения медленным и неэффективным, который уменьшает эффективность программы. Разработчики ожидают, что конструкция перемещения использует семантику перемещения только. Неожиданно использующая семантика копии в конструкторах перемещения может ввести утечки ресурсов и несоответствие в будущей разработке. При авторской разработке конструкторов перемещения инициализируйте элементы данных и базовые классы при помощи семантики перемещения. Можно скопировать - инициализируют скалярные элементы данных, не нарушая это правило.
Вы можете использовать std::move()
реализовывать семантику перемещения в вашем коде. Когда вы используете std::move()
чтобы переместить объекты, объявите объекты или элементы данных без спецификатора const
. Для получения дополнительной информации смотрите AUTOSAR C++14 Rule A18-9-3
.
Когда конструктор перемещения не использует семантику перемещения, чтобы инициализировать нескалярные элементы данных и базовые классы, Polyspace® отмечает свое объявление. Например, если конструктор перемещения инициализирует базовый класс при помощи конструктора по умолчанию вместо конструктора перемещения, Polyspace отмечает объявление конструктора перемещения.
Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.
Группа: Специальные функции членства |
Категория: необходимый, автоматизированный |