Найти в Дзене

Добрый C++ для начинающих. Забегая далеко вперед. Move и copy семантика.

Идея этой заметки навеяна сложностями понимания семантики перемещения (move semantics, Wikipedia), с которыми сталкиваются изучающие С++ на онлайн курсах при отсутствии поддержки. У меня была возможность показать правильный путь решения задач стороннего онлайн-курса на Stepik , где обучающиеся столкнулись со сложностями, а поддержка отсутствовала. Важность понимания различий между копированием и перемещением объектов (для стандартов C++ 11 и новее) не поддается измерению. Рассмотрим ситуацию на примере функции push_back для вектора. Copy semantics (push_back(const T& value)) означает, что ваш вектор создаёт копию объекта, когда добавляет его. Это важно помнить, потому что не все объекты легко копируются. Допустим, вы хотите добавить std::unique_ptr<int> в ваш вектор. std::unique_ptr обладает exclusive ownership, что означает, что он управляет единственным указателем на объект, и его копирование запрещено. Если вы попытаетесь добавить std::unique_ptr в вектор с copy semantics, испол
Оглавление

Идея этой заметки навеяна сложностями понимания семантики перемещения (move semantics, Wikipedia), с которыми сталкиваются изучающие С++ на онлайн курсах при отсутствии поддержки.

У меня была возможность показать правильный путь решения задач стороннего онлайн-курса на Stepik , где обучающиеся столкнулись со сложностями, а поддержка отсутствовала.

Важность понимания различий между копированием и перемещением объектов (для стандартов C++ 11 и новее) не поддается измерению.

Рассмотрим ситуацию на примере функции push_back для вектора.

Понимание Copy Semantics

Copy semantics (push_back(const T& value)) означает, что ваш вектор создаёт копию объекта, когда добавляет его. Это важно помнить, потому что не все объекты легко копируются.

Non-Copyable объекты как параметры

Допустим, вы хотите добавить std::unique_ptr<int> в ваш вектор. std::unique_ptr обладает exclusive ownership, что означает, что он управляет единственным указателем на объект, и его копирование запрещено.

Если вы попытаетесь добавить std::unique_ptr в вектор с copy semantics, используя std::move внутри push_back, вы столкнетесь с ошибкой компиляции.

Пример НЕПРАВИЛЬНОГО использования семантики перемещения
Пример НЕПРАВИЛЬНОГО использования семантики перемещения

Перегрузка для rvalue

Чтобы избежать этой проблемы, необходимо перегрузить push_back для работы с rvalue (stackoverflow), которое может быть перемещено. В этом случае мы перемещаем ownership std::unique_ptr внутрь вектора.

Пример правильного использования семантики перемещения
Пример правильного использования семантики перемещения

Подписывайтесь на канал!

Ставьте лайки ☺ !

⭐ Авторский практический учебный курс "ChatGPT в помощь Java-разработчику" на Stepik и канал авторской поддержки на Дзен

Индивидуальные консультации. Обращайтесь через почту в описании канала.

⭐ Телеграм:
https://t.me/dobryj_cpp