在「Rust学习笔记 - Future、Waker 与异步任务调度」中实现异步任务执行器 block_on 时,用到了 Pin 来保证某些值在内存中不被移动,想着展开学习一下。
什么是值的移动
Rust 中的值默认可以移动。移动通常发生在赋值、传参和从函数返回时,例如:
1 | let name = String::from("hallo"); |
这里不是把 String 中的文本复制了一份。name 持有的值被转移给 other,之后也不能再通过 name 访问它。对于 String 这类普通类型,移动通常不需要关心它在内存中的具体位置。只要所有权完成转移,内部管理的堆内存仍然可以正常释放和访问。