You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 21:05:50