Семантика перемещения

Эта статья находится на начальном уровне проработки, в одной из её версий выборочно используется текст из источника, распространяемого под свободной лицензией
Материал из энциклопедии Руниверсалис

Семантика перемещения (англ. move semantics) — собирательное название специализированных средств языка программирования C++, которые предназначены для осуществления перемещения данных во время инициализации и конструирования новых объектов, что позволяет сократить издержки на копирование. Для практического осуществления семантики перемещения в синтаксис C++ введены rvalue ссылки, а также конструкторы перемещения и перемещающий оператор присваивания[1].

Появление в стандарте языка C++ семантики перемещения состоялось с выходом обновлённого стандарта C++11; оно было продиктовано необходимостью оптимизировать вычислительные расходы там, где до этого применялась семантика передачи по значению[2].

Введение семантики перемещения данных в стандарт языка получило высокую оценку сообщества разработчиков ввиду того, что она даёт широкие возможности для оптимизации внутреннего кода вызовов функций и методов классов. Эта оптимизация достигается отказом от копирования данных при создании временных объектов, у которых отсутствует необходимость сохранять их внутренние ресурсы для дальнейшего использования[3].

Появление в стандарте семантики перемещения потребовало формализовать вывод аргументов параметризованных типов (шаблонов) и их использование, в связи с чем появился регламент прямой передачи[4], а «правило трёх» эволюционировало в «правило пяти»: теперь при управлении памятью помимо конструктора копирования, деструктора и копирующего оператора присваивания разработчику требуется определить конструктор перемещения и перемещающий оператор присваивания[5]. Компилятору разрешено их автоматически задействовать тогда, когда их аргументы соответствуют определению rvalue[6].

Примечания

  1. Пай, Абрахам, 2018, Семантика перемещения, с. 50.
  2. Sehr, Andrist, 2018, Move semantics explained.
  3. Вандевурд, 2018, Семантика перемещения и enable_if<>, с. 125.
  4. Вандевурд, 2018, Применения шаблонов с переменным количеством аргументов, с. 95.
  5. Sehr, Andrist, 2018, Introducing move semantics.
  6. Sehr, Andrist, 2018, Named variables and r-values.

Источники

  • Д. Вандевурд, Н. Джосаттис, Д. Грегор. Шаблоны C++. Справочник разработчика = C++ Templates. The Complete Guide. — 2-е. — СПб. : «Альфа-книга», 2018. — 848 с. — ББК 32.973.26-018.2.75. — УДК 681.3.07(G). — ISBN 978-5-9500296-8-4.
  • П. Пай, П. Абрахам. Реактивное программирование на C++. — М. : ДМК Пресс, 2018. — 324 с. — ББК 32973.202-018.2. — УДК 004.4(G). — ISBN 978-5-97060-778-7.
  • V. Sehr, B. Andrist. C++ High Performance. Boost and optimize the performance of your C++17 code : [англ.]. — Birmingham, Mumbai : Packt Publishing, 2018. — ISBN 978-1-78712-095-2.