Rust におけるムーブとは何か
常にビット単位のコピーであり、Copy を実装していない型であっても同様です。
// Copyright 2026 Google LLC // SPDX-License-Identifier: Apache-2.0 #[derive(Debug, Default)] pub struct DynamicBuffer { data: Vec<u8>, position: usize, }; pub fn move_and_inspect(x: DynamicBuffer) { println!("{x:?}"); } pub fn main() { let a = DynamicBuffer::default(); let mut b = a; b.data.push(b'R'); b.data.push(b'U'); b.data.push(b'S'); b.data.push(b'T'); move_and_inspect(b); }
move_and_expect() の呼び出しに対して生成された LLVM IR:
call void @llvm.memcpy.p0.p0.i64(ptr align 8 %_12, ptr align 8 %b, i64 32, i1 false)
invoke void @move_and_inspect(ptr align 8 %_12)
- 変数
%bから%_12へのmemcpy %_12(コピー)を使ってmove_and_inspectを呼び出す
DynamicBuffer は Copy を実装していないことに注意してください。
示唆されること: 値のメモリアドレスは安定していません。
移動がビット単位のコピーであることを示すには、playground でコードを開き、または the Compiler Explorer を参照してください。
アセンブリ出力のほうがよい人向け:
The Compiler Explorer は、生成されたアセンブリを議論するのに便利です。main 関数内のアセンブリ出力の 128-136 行目にカーソルを合わせてください(ピンクでハイライトされるはずです)。
move_and_inspect に対して生成された関連コード出力:
mov rax, qword ptr [rsp + 16]
mov qword ptr [rsp + 48], rax
mov rax, qword ptr [rsp + 24]
mov qword ptr [rsp + 56], rax
movups xmm0, xmmword ptr [rsp]
movaps xmmword ptr [rsp + 32], xmm0
lea rdi, [rsp + 32]
call qword ptr [rip + move_and_inspect@GOTPCREL]