8.2 什么是移动
02-什么是移动 — Comprehensive Rust
1分钟内可阅读完
译文 · 基于 Comprehensive Rust
原文链接: https://google.github.io/comprehensive-rust/unsafe-deep-dive/pinning/what-a-move-is.html
8.2 什么是移动
即使对于未实现 Copy 的类型,移动也始终是按位拷贝:
| |
调用 move_and_inspect() 时生成的 LLVM IR:
| |
- 从变量
%b到%_12的memcpy - 使用
%_12(拷贝)调用move_and_inspect
注意
DynamicBuffer并未实现Copy。推论:值的内存地址并不稳定。
要展示移动是按位拷贝,可以在 playground 中打开代码查看,或使用 [Compiler Explorer]。
偏好汇编输出的可选内容:
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]