8 Pinning(固定)

Pinning(固定) — Comprehensive Rust

译文 · 基于 Comprehensive Rust

原文链接: https://google.github.io/comprehensive-rust/unsafe-deep-dive/pinning.html

8 Pinning(固定)

本课程本节涵盖:

  • 什么是「pinning(固定)」
  • 为何需要它
  • Rust 如何实现它
  • 它如何与 unsafe 和 FFI 交互

大纲

本小节约需 1 小时 20 分钟。内容包括:

内容时长
什么是 pinning5 分钟
Pin 的定义5 分钟
PhantomPinned 标记类型5 分钟
自引用缓冲区示例50 分钟
Pin<Ptr> 与 Drop15 分钟

「Pinning,即让某个值的内存地址保持在固定位置,是 Rust 中较难理解的概念之一。」

「它通常只在 async 代码中出现,例如 poll(self: Pin<&mut Self>),但 pinning 的适用范围更广。」

有些数据结构若不使用 unsafe 关键字则难以或无法编写,包括自引用结构体和侵入式数据结构。

与 C++ 的 FFI 是一个与此相关的重要用例。Rust 必须假设任何带引用的 C++ 代码都可能是自引用数据结构。

「要更详细地理解这一冲突,我们首先需要确保对 Rust 的移动语义有扎实的理解。」


8.1 什么是 pinning

01-什么是 pinning — Comprehensive Rust

8.2 什么是移动

02-什么是移动 — Comprehensive Rust

8.3 Pin<Ptr> 的定义

03-Pin 的定义 — Comprehensive Rust

8.4 为何难以使用

04-为何难以使用 — Comprehensive Rust

8.5 `Unpin` trait(可解除固定)

05-Unpin trait(可解除固定) — Comprehensive Rust

8.6 `PhantomPinned` 标记类型

06-PhantomPinned 标记类型 — Comprehensive Rust

8.7 自引用缓冲区示例

自引用缓冲区示例 — Comprehensive Rust

8.8 `Pin<Ptr>` 与 `Drop`

Pin<Ptr> 与 Drop — Comprehensive Rust

最后修改 August 11, 2026: 更新 (70a5af133)