![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
IntroductionBoost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 23. Boost.Move
|
![]() |
Note |
---|---|
Первые 3 главы адаптированы из статьиКраткое введение в ссылки на значениеГовард Э. Хиннант, Бьярн Страуструп и Бронек Козики |
Копирование может быть дорогостоящим. Например, для векторов<v2=v1
>обычно требуется вызов функции, выделение памяти и цикл. Это, конечно, приемлемо, когда нам действительно нужны две копии вектора, но во многих случаях мы этого не делаем: мы часто копируем<vector
>из одного места в другое, просто чтобы перейти к перезаписи старой копии. Подумайте:
template <class T> void swap(T& a, T& b) { T tmp(a); // now we have two copies of a a = b; // now we have two copies of b b = tmp; // now we have two copies of tmp (aka a) }
Но мы не хотели иметь никаких копий a или b, мы просто хотели поменять их. Попробуем еще раз:
template <class T> void swap(T& a, T& b) { T tmp(::boost::move(a)); a = ::boost::move(b); b = ::boost::move(tmp); }
Это<move()
>придает своей цели ценность ее аргумента, но не обязано сохранять ценность ее источника. Таким образом, для<vector
>,<move()
>можно было бы разумно ожидать, чтобы оставить свой аргумент в качестве вектора нулевой емкости, чтобы избежать необходимости копировать все элементы. Иными словами,ход является потенциально разрушительной копией.
В этом конкретном случае мы могли бы оптимизировать обмен по специализации. Однако мы не можем специализировать каждую функцию, которая копирует большой объект непосредственно перед его удалением или перезаписью. Это было бы неуправляемо.
В C++0x семантика движения реализуется с введением ссылок на rvalue. Они позволяют нам реализовать<move()
>без многословия или накладных расходов.Boost.Move— это библиотека, которая предлагает инструменты для реализации семантики перемещения не только в компиляторах с<rvalue
references
>, но и в компиляторах, соответствующих C++03.
Статья Introduction раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 23. Boost.Move может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Chapter 23. Boost.Move ::
реклама |