Skip to content
TopicTracker
来自 HackerNews查看原文
译文语言译文语言

Rust 中 `std::pin::Pin` 是什么?

Pin 是 Rust 中的一个类型,用于确保内存中的值不会被移动,即使是在异步编程、自引用结构或某些需要稳定地址的场景中。它通过阻止实现 `Unpin` trait 的类型被移动来实现这一保证。本文从基础概念出发,深入解释了 Pin 的工作原理、它与 `Box` 和 `Unpin` 的关系,以及在实际代码中如何安全地使用它来处理自引用数据和 `Future`。

背景速读

Rust 是一门强调内存安全和零成本抽象的系统编程语言。它的核心机制之一是所有权(ownership),编译器在编译时就能确定每个值何时被释放。这通常意味着值在内存中的位置可以是固定的,也可以被移动(move)。但某些场景——比如自引用结构体(struct 内部有指向自身字段的指针),或者需要把数据交给异步运行时(如 tokio)执行——要求值在实例化后**绝对不能移动**,否则指针就会悬空,引发未定义行为。 - **`std::pin::Pin<T>`**:Rust 标准库提供的包装类型。它保证内部的值(被 `Pin` 包裹的 `T`)一旦被固定(pinned),就不会再被移动。它是对编译器所有权系统的一种补充——所有权只保证不被多次释放,而 Pin 保证内存地址不变。 - **为什么需要它**:async/await 生成的 Future 是一个典型例子。一个 Future 背后可能是一个自引用的状态机(自身引用自己的局部变量)。如果不固定,当 Future 在 executor 间被 move 时,内部指针会指向旧地址,导致崩溃或数据损坏。 - **关键约束**:只有实现了 `!Unpin` trait 的类型才会被 Pin 真正"钉住"。大多数普通类型默认实现了 `Unpin`,意味着它们即使被 Pin 包裹也可以安全移动(Pin 对它们无效)。

相关报道