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 を呼び出す

DynamicBufferCopy を実装していないことに注意してください。

示唆されること: 値のメモリアドレスは安定していません。

移動がビット単位のコピーであることを示すには、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]