Loading AI tools
Из Википедии, свободной энциклопедии
Семантика перемещения (англ. move semantics) — собирательное название специализированных средств языка программирования C++, которые предназначены для осуществления перемещения данных во время инициализации и конструирования новых объектов, что позволяет сократить издержки на копирование. Для практического осуществления семантики перемещения в синтаксис C++ введены rvalue ссылки, а также конструкторы перемещения и перемещающий оператор присваивания[1].
Появление в стандарте языка C++ семантики перемещения состоялось с выходом обновлённого стандарта C++11; оно было продиктовано необходимостью оптимизировать вычислительные расходы там, где до этого применялась семантика передачи по значению[2].
Введение семантики перемещения данных в стандарт языка получило высокую оценку сообщества разработчиков ввиду того, что она даёт широкие возможности для оптимизации внутреннего кода вызовов функций и методов классов. Эта оптимизация достигается отказом от копирования данных при создании временных объектов, у которых отсутствует необходимость сохранять свои внутренние ресурсы для дальнейшего использования[3].
Появление в стандарте семантики перемещения потребовало формализовать вывод аргументов параметризованных типов (шаблонов) и их использование, в связи с чем появился регламент прямой передачи[4], а «правило трёх» эволюционировало в «правило пяти»: теперь при управлении памятью помимо конструктора копирования, деструктора и копирующего оператора присваивания разработчику требуется определить конструктор перемещения и перемещающий оператор присваивания[5]. Компилятору разрешено их автоматически задействовать тогда, когда их аргументы соответствуют определению rvalue[6].
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.