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

Семантика перемещения (англ. 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.

ИсточникиПравить