Семантика перемещения
Семантика перемещения (англ. move semantics) — собирательное название специализированных средств языка программирования C++, которые предназначены для осуществления перемещения данных во время инициализации и конструирования новых объектов, что позволяет сократить издержки на копирование. Для практического осуществления семантики перемещения в синтаксис C++ введены rvalue ссылки, а также конструкторы перемещения и перемещающий оператор присваивания[1].
Появление в стандарте языка C++ семантики перемещения состоялось с выходом обновлённого стандарта C++11; оно было продиктовано необходимостью оптимизировать вычислительные расходы там, где до этого применялась семантика передачи по значению[2].
Введение семантики перемещения данных в стандарт языка получило высокую оценку сообщества разработчиков ввиду того, что она даёт широкие возможности для оптимизации внутреннего кода вызовов функций и методов классов. Эта оптимизация достигается отказом от копирования данных при создании временных объектов, у которых отсутствует необходимость сохранять их внутренние ресурсы для дальнейшего использования[3].
Появление в стандарте семантики перемещения потребовало формализовать вывод аргументов параметризованных типов (шаблонов) и их использование, в связи с чем появился регламент прямой передачи[4], а «правило трёх» эволюционировало в «правило пяти»: теперь при управлении памятью помимо конструктора копирования, деструктора и копирующего оператора присваивания разработчику требуется определить конструктор перемещения и перемещающий оператор присваивания[5]. Компилятору разрешено их автоматически задействовать тогда, когда их аргументы соответствуют определению rvalue[6].
ПримечанияПравить
- ↑ Пай, Абрахам, 2018, Семантика перемещения, с. 50.
- ↑ Sehr, Andrist, 2018, Move semantics explained.
- ↑ Вандевурд, 2018, Семантика перемещения и enable_if<>, с. 125.
- ↑ Вандевурд, 2018, Применения шаблонов с переменным количеством аргументов, с. 95.
- ↑ Sehr, Andrist, 2018, Introducing move semantics.
- ↑ 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.