Rust中向量元素引用&i32的作用及与直接取值的区别疑问
Rust中向量元素引用与复制的区别
两段代码不等价
直接明确结论:这两段代码的行为完全不同,核心差异在于复制值和获取引用的区别。
示例2:复制值的行为
let v = vec![1, 2, 3, 4, 5]; let third: i32 = v[2];
因为i32实现了Copy trait,执行这段代码时,会把向量v中索引2处的元素值(即3)完整复制一份,赋值给新变量third。此时:
third是独立的i32变量,和v中的原元素无关联,修改third不会影响v,反之亦然。third占用i32大小的内存(通常4字节),存储的是值本身。
示例1:获取引用的行为
let v = vec![1, 2, 3, 4, 5]; let third: &i32 = &v[2];
这里的&i32是不可变共享引用,本质是指向原数据的指针:
third没有复制v[2]的值,而是存储了v[2]在内存中的地址,大小为一个指针的尺寸(64位系统是8字节)。- 通过
*third可以访问原元素的值,但因是不可变引用,无法修改原元素(若使用&mut i32则允许修改)。 - 这段代码受Rust借用规则约束:在
third的生命周期内,不能对v获取可变引用,也不能移动v,这是Rust保证内存安全的核心机制。
关于Copy类型的引用误区
你提到的“简单值会被复制,无法从两处引用同一简单值”是对Rust规则的误解:
Copytrait仅规定赋值、传参等场景下自动复制值,但完全不限制对该值创建引用。- 即使是
i32这类Copy类型,依然可以创建多个不可变引用指向它,符合Rust内存安全规则。示例:let x = 5; let ref1 = &x; let ref2 = &x; // 同时持有两个不可变引用是合法的
内容的提问来源于stack exchange,提问作者bennouli
相关产品推荐
相关产品推荐

