当前位置: 首页 > news >正文

“u64”,“mut u64”,“String”,“mut String” 区别

rust内存中的引用

概念:
&指针本身大小就是4/8个字节(32/64计算机的最大寻址空间)
size_of::<&type>(),无论type是什么,打印的只是指针本身大小(最大寻址空间)

详细说明

| 🏁 对比&u64&mut u64&String

&u64 - 不可变引用

let x: u64 = 42;
let r: &u64 = &x;// 内存布局
Stack:
┌──────────────┐
│  x: u64      │
│  [42]        │  8 字节(实际数据)
├──────────────┤
│  r: &u64     │
│  [0x7fff...] │  8 字节(指针,指向 x)
└──────────────┘// 特性
✅ 可以读取
❌ 不能修改
✅ 可以有多个不可变引用(即`r`能多次赋值变量)

示例

let x = 42u64;
let r1 = &x;
let r2 = &x;  // ✅ 多个不可变引用同时存在
println!("{}", *r1);  // ✅ 可以解引用读取
// *r1 = 100;  // ❌ 编译错误:不能通过不可变引用修改

&mut u64 - 可变引用

let mut x: u64 = 42;
let r: &mut u64 = &mut x;// 内存布局
Stack:
┌──────────────┐
│  x: u64      │
│  [42]        │  8 字节(实际数据,可变)
├──────────────┤
│  r: &mut u64 │
│  [0x7fff...] │  8 字节(指针,指向 x)
└──────────────┘// 特性
✅ 可以读取
✅ 可以修改
❌ 同时只能有一个可变引用

示例

let mut x = 42u64;
let r = &mut x;
*r = 100;       // ✅ 可以修改
println!("{}", *r);  // ✅ 可以读取// let r2 = &mut x;  // ❌ 编译错误:不能同时有两个可变引用
// let r3 = &x;      // ❌ 编译错误:有可变引用时不能有不可变引用

指向 String 的不可变引用

let s: String = "hello".to_string();
let r: &String = &s;// 内存布局
Stack:                     Heap:
┌──────────────┐          ┌──────────┐
│  s: String   │          │ "hello"  │
│  ptr: ●──────┼─────────>│ (5 bytes)│
│  cap: 5      │          └──────────┘
│  len: 5      │  24 bytes
├──────────────┤
│  r: &String  │
│  [0x7fff...] │──┐  8 bytes (指向 s)
└──────────────┘  │↓指向上面的 String 结构

示例

let s = String::from("hello");
let r: &String = &s;
println!("{}", r);      // ✅ 可以读取
println!("{}", r.len());  // ✅ 可以调用方法
// r.push_str("!");      // ❌ 不能修改
// s.push_str("!");      // ❌ s 被借用期间也不能修改

三者对比表

类型 大小 可读 可写 多个同时存在 指向的数据大小
&u64 8 字节 8 字节
&mut u64 8 字节 8 字节
&String 8 字节 24 字节(栈)+ 堆数据
&mut String 8 字节 24 字节(栈)+ 堆数据
&Ticket 8 字节 72 字节(栈)+ 堆数据

❗备注:Ticket(自定义类型。有三个String属性)

关键区别

区别 1:可变性(Mutability)

// 不可变引用
let x = 42;
let r = &x;
// *r = 100;  // ❌ 错误// 可变引用
let mut x = 42;
let r = &mut x;
*r = 100;     // ✅ 正确

区别 2:借用规则

let mut x = 42;// 规则1:多个不可变引用可以共存
let r1 = &x;
let r2 = &x;
let r3 = &x;  // ✅ // 规则2:可变引用独占
let r1 = &mut x;
// let r2 = &mut x;  // ❌ 不能有第二个
// let r3 = &x;      // ❌ 不能混合// 规则3:引用作用域结束后可以重新借用
{let r1 = &x;println!("{}", r1);
}  // r1 作用域结束
let r2 = &mut x;  // ✅ 

区别 3:指向的数据类型

// 指向简单类型
let n: u64 = 42;
let r: &u64 = &n;  // 指向 8 字节的整数// 指向复杂类型
let s: String = "hello".to_string();
let r: &String = &s;  // 指向 24 字节的 String 结构(不包括堆数据)let ticket: Ticket = Ticket::new(...);
let r: &Ticket = &ticket;  // 指向 72 字节的 Ticket 结构
http://www.jsqmd.com/news/440036/

相关文章:

  • Python flask微信小程序的高考志愿填报辅助系统_701xwq5m
  • # 中澳航线机票预订十大FAQ详解:避坑指南+专业解答,出行认准北京圣擎航空 - 今日又土又金
  • 为啥说AI能让10年前的“电子女友”重新活过来?
  • 万象焕新 “AI赋能 代码可信”:泛联新安研发效能智能体产品系列命名正式发布
  • python创建了虚拟环境但是pip没有使用虚拟配置
  • 独立评测视角:技术拆解 WUDASHU(吴大叔)气垫高跟鞋的底层逻辑与市场表现 - 数字营销分析
  • 2026年AI智能软硬件开发行业资质审核结果大揭秘
  • AcWing 3688:集合交并 ← STL set(复旦大学考研机试题)
  • SRT协议分析(握手控制包)
  • 四川哪里有靠谱的板房回收厂家?本地资深回收企业一览 - 深度智识库
  • 2026年聚合物锂电池优质厂家推荐指南重服务强保障 - 优质品牌商家
  • 2026年四川反渗透阻垢剂/反渗透清洗剂优质厂家榜单 适配多行业水处理 实用选型参考 - 深度智识库
  • 2026权威锂电池厂家推荐榜:锂电池工艺流程图/锂电池电池/储能电池/电源管理系统/聚合物锂电池/铝壳锂电池/选择指南 - 优质品牌商家
  • 宽脚板、大脚骨、没脚后跟怎么买鞋?亚洲女性专属挑鞋法则 - 数字营销分析
  • 宽脚板买鞋屡屡踩雷?深扒吴大叔(WUDASHU)高跟鞋:不挤脚必须看准这3个指标 - 数字营销分析
  • 如何通过 5 种方法将 iPhone 上的备忘录传输到电脑?
  • 四川空调回收厂家推荐:专业靠谱的本地回收服务商有哪些? - 深度智识库
  • MATLAB版本的PESQ语音质量评价代码实现
  • 如何在Android中恢复已删除的 DCIM 文件夹
  • DeepSeek之后,AI团队真正的分水岭:从会调模型到能交付Agent系统
  • 从价格、售后到打印精度:主流3D打印机供应商最新全面横向测评 - 深度智识库
  • 飞跃南半球:中澳航线机票预订十大核心问题全指南 - 今日又土又金
  • 2026毕业季救命稻草:DDL倒计时3天,如何用Scholingo合法“速成”一篇合格初稿?
  • 运维日记 - 猛男的AI拓荒录:K8sGPT Dev环境落地与“笨蛋运维”培训计划
  • 2026成都沙发翻新优质服务推荐榜:沙发维修翻新/沙发翻新上门服务/沙发翻新价格/沙发翻新换布/沙发翻新换海绵/选择指南 - 优质品牌商家
  • Flutter 三方库 dart_pubspec_licenses 的鸿蒙化适配指南 - 掌控开源合规审计、依赖许可证扫描实战、鸿蒙级精密工程法务
  • 2026年烘干机优质厂家推荐 油茶果 / 辣椒 / 中药材 / 果皮烘干设备优选品牌 - 深度智识库
  • 对称二叉树-leetcode
  • 四川变压器回收厂家推荐:专业资质与高回收价兼备的优质服务商 - 深度智识库
  • AI编程_claude处理mysql数据库mcp