Эта проблема, кажется, подразумевает, что это просто деталь реализации ( memcpy
против ???), но я не могу найти явного описания различий.
128
Эта проблема, кажется, подразумевает, что это просто деталь реализации ( memcpy
против ???), но я не могу найти явного описания различий.
Ответы:
Clone
предназначен для произвольного дублирования:Clone
реализация типаT
может выполнять сколь угодно сложные операции, необходимые для создания новогоT
. Это обычная черта (кроме прелюдии), поэтому ее необходимо использовать как обычную черту, с вызовами методов и т. Д.Эта
Copy
черта представляет значения, которые можно безопасно дублировать с помощьюmemcpy
: такие вещи, как переназначение и передача аргумента по значению функции, всегдаmemcpy
s, поэтому дляCopy
типов компилятор понимает, что ему не нужно рассматривать это как ход .источник
Clone
такое глубокая копия, аCopy
есть теневая копия?Clone
открывает возможность того, что тип может делать либо глубокую, либо неглубокую копию: «произвольно сложный».Основное отличие заключается в явном клонировании. Неявная запись означает перемещение для не-
Copy
типа.Кстати, каждый
Copy
тип тоже должен бытьClone
. Однако они не обязаны делать то же самое! Для ваших собственных типов это.clone()
может быть произвольный метод по вашему выбору, тогда как неявное копирование всегда будет запускать amemcpy
, а неclone(&self)
реализацию.источник
y
получить перемещенный объектx
, а не его копию, как в последнем закомментированном примереw = v
. Как бы вы это обозначили?Copy
он предназначен для реализации для «дешевых» типов, какu8
в примере. Если вы пишете довольно тяжелый шрифт, для которого, по вашему мнению, ход более эффективен, чем копия, делайте это не подразумеваемымCopy
. Обратите внимание, что в случае с u8 вы не можете быть более эффективными с перемещением, так как под капотом это, вероятно, по крайней мере повлечет за собой копию указателя, которая уже так же дорога, как копия u8, так что зачем беспокоиться.Copy
признака влияет на неявные области существования переменных? Если так, я думаю, это примечательно.Как уже упоминалось в других ответах:
Copy
является неявным, недорогим и не может быть повторно реализован (memcpy).Clone
является явным, может быть дорогостоящим и может быть произвольно повторно реализован.При обсуждении
Copy
vs иногда не хватает того,Clone
что он также влияет на то, как компилятор использует ходы против автоматических копий. Например:Первый пример (
PointCloneAndCopy
) здесь отлично работает из-за неявной копии, но второй пример (PointCloneOnly
) будет ошибкой при использовании после перемещения:Чтобы избежать неявного перемещения, мы могли бы явно вызвать
let p2 = p1.clone();
.Это может вызвать вопрос о том, как принудительно выполнить перемещение типа, который реализует свойство Copy? , Краткий ответ: вы не можете / не имеет смысла.
источник