В чем разница между копированием и клонированием?
этот вопрос кажется, это просто деталь реализации (memcpy vs ???), но я не могу найти четкое описание различий.
2 ответов:
Cloneпредназначен для произвольных дубликатов: aCloneреализация для типаTможно делать сколь угодно сложные операции, необходимые для создания новыхT. Это нормальная черта (кроме того, что она находится в прелюдии), и поэтому требует использования как обычная черта, с вызовами методов и т. д.The
Copyпризнак представляет значения, которые можно безопасно дублировать черезmemcpy: такие вещи, как переводы и передачи аргумента по значению функции всегдаmemcpyS, и так дляCopyтипы, компилятор понимает, что ему не нужно рассматривать эти движение.
основное различие заключается в том, что клонирование-это явный. Неявная нотация означает перемещение для не -
Copyтип.// u8 implements Copy let x: u8 = 123; let y = x; // x can still be used println!("x={}, y={}", x, y); // Vec<u8> implements Clone, but not Copy let v: Vec<u8> = vec![1, 2, 3]; let w = v.clone(); //let w = v // This would *move* the value, rendering v unusable.кстати, каждый
Copyтип должен бытьClone. Однако, они не обязаны делать то же самое! Для ваших собственных типов,.clone()может быть произвольным методом по вашему выбору, в то время как неявное копирование всегда будет вызыватьmemcpy, а неclone(&self)реализация.
Comments