Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

【自習メモ】Rust言語のCopyとClone

deriveにcopyとcloneがありますが、違いがわからなかったのでメモ
Rust言語の特徴である所有権の移動と密に関係している概念な様子

実際のところ

// Copy型の例
fn process_point(p: Point) {
    println!("Processing: ({}, {})", p.x, p.y);
}

let p1 = Point { x: 1, y: 2 };
process_point(p1);  // p1の値がコピーされる
println!("p1: ({}, {})", p1.x, p1.y);  // p1は依然として使用可能

// Clone型の例
fn process_string(s: String) {
    println!("Processing: {}", s);
}

let s1 = String::from("hello");
process_string(s1.clone());  // s1のクローンを渡す
println!("s1: {}", s1);  // s1は依然として使用可能

対象

copyは数値やタプル・配列など、単純なビットコピー可能なものが対象

cloneはStringやヒープ領域に割り当てるものなど、複雑なコピーが必要なものが対象
ディープコピーが必要な場合はclone

C言語との比較

copyはC言語のスタック変数のコピーに似ている

cloneはC言語だとmallocやmemcpyに振る舞いに似ている