Использование std::swap
;это сделает лучшую работу, которую он может.Если ваш компилятор поддерживает ссылки Rvalue в C ++ 11, это означает, что он будет использовать преимущества семантики перемещения, чтобы избежать копирования, которое происходит в вашей функции подкачки.
Однако, если ваш компилятор не поддерживает ссылки на rvalue,он, скорее всего, будет работать так же, как ваша функция подкачки.
В большинстве реализаций стандартной библиотеки std::swap
будет реализован примерно так:
template<typename T>
void swap(T& a, T& b) {
T temp(std::move(a));
a = std::move(b);
b = std::move(temp);
}
Функция std::move
вернетссылка rvalue (T &&) на переданную переменную. Когда вы попытаетесь назначить эту ссылку rvalue, она вызовет оператор перемещения типа, если он доступен.Если оператор перемещения недоступен, он будет вызывать оператор копирования, как обычно.
В случае std::string
вышеупомянутая функция подкачки не будет копировать строки с C ++ 11;будут скопированы только внутренние данные, такие как длина строки и указатель строки C.Без C ++ 11 он будет выполнять три копии фактического содержимого строки.