在 Rust 中,结构体默认是值类型(value type)。当您创建一个结构体实例时,它会在栈上分配内存,并将该实例的所有字段存储在该内存中。当您对结构体进行赋值、传递给函数或返回值时,将发生值的复制或移动操作。
这意味着每个结构体实例都是独立的,并在内存中占据自己的空间。对一个结构体实例的修改不会影响其他实例。
以下是一个示例,展示了结构体在 Rust 中的值语义:
```rust
struct Point {
x: i32,
y: i32,
}
fn main() {
let p1 = Point { x: 1, y: 2 };
let p2 = p1; // 值复制,p2 拥有独立的内存空间
println!("p1: x = {}, y = {}", p1.x, p1.y); // 正常打印 p1 的值
println!("p2: x = {}, y = {}", p2.x, p2.y); // 正常打印 p2 的值
}
```
在这个例子中,通过将 `p1` 赋值给 `p2`,会发生一次结构体的值复制操作,因此 `p1` 和 `p2` 分别拥有独立的内存空间。修改 `p2` 的字段值不会影响 `p1` 的值。
需要注意的是,Rust 提供了一些特殊的结构体类型,例如引用计数指针 `Rc<T>` 和原子引用计数指针 `Arc<T>`,它们是共享所有权的智能指针类型,具有类似引用类型的行为,但不是严格的值类型。但是,对于常规的自定义结构体,它们默认是值类型。