Rust中借用的整数与复制的整数是否存在差异?
Rust中整数复制与引用的差异
先明确背景:
- String在Rust中由指向堆内存的指针构成,为避免双重释放问题,Rust禁止直接复制String,而是通过借用机制仅复制指针,不复制堆上的数据。
- 整数这类基本类型存储在栈上,没有堆指针,但依然可以创建其引用,示例代码:
let i: i64 = 42; let j = &i;
核心问题:整数的借用和普通复制是否等价?j = i与j = &i有没有差异?
答案是完全不等价,两者在类型、所有权语义、内存行为上都有明显区别:
类型差异
let j = i:j的类型是i64,直接拥有该整数的独立副本,是栈上的全新值。let j = &i:j的类型是&i64(不可变引用),它不持有值的所有权,只是一个指向i所在栈内存地址的指针。
所有权与约束差异
- 复制整数:j获得独立的所有权,后续修改i不会影响j,两者生命周期互不干扰,也没有借用规则限制。
- 引用整数:j是对i的借用,必须遵守Rust的借用规则——比如存在不可变引用j时,i无法被修改;i也不能在j存活期间被销毁,否则会产生悬垂引用。
内存行为差异
- 复制整数:会在栈上开辟新的内存空间,拷贝i的完整值(对于i64来说是8字节的拷贝,开销极小,但本质是独立副本)。
- 引用整数:仅拷贝一个指针(64位系统下为8字节),j指向的是i的栈内存地址,读取j的值时需要一次间接寻址。
示例对比
// 整数复制的场景 let mut i = 42; let j = i; i = 100; println!("{}", j); // 输出42,j是独立副本不受i修改影响 // 整数引用的场景 let mut i = 42; let j = &i; // i = 100; // 编译报错:不可变引用存活时无法修改原变量 println!("{}", j); // 输出42
简言之,即便整数是Copy类型、复制开销极低,引用和复制的语义依然完全不同——引用是借用所有权,复制是获取独立所有权。
内容的提问来源于stack exchange,提问作者Karolex
相关产品推荐
相关产品推荐

