В чем разница между копированием и клонированием?



этот вопрос кажется, это просто деталь реализации (memcpy vs ???), но я не могу найти четкое описание различий.

875   2  

2 ответов:

Clone предназначен для произвольных дубликатов: a Clone реализация для типа 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

    Ничего не найдено.