[初学rust] 03_所有权

所有权

前置

在计算机语言不断演变过程中,内存管理是一个很重要的话题。当前的三种流派:

  • 垃圾回收机制(GC),在程序运行时不断寻找不再使用的内存,典型代表:Java、Go
  • 手动管理内存的分配和释放, 在程序中,通过函数调用的方式来申请和释放内存,典型代表:C++
  • 通过所有权来管理内存,编译器在编译时会根据一系列规则进行检查

什么是所有权?

描述:

  1. Rust 中每一个值都被一个变量所拥有,该变量被称为值的所有者
  2. 一个值同时只能被一个变量所拥有,或者说一个值只能拥有一个所有者
  3. 当所有者(变量)离开作用域范围时,这个值将被丢弃(drop)
    人话:
    这个就是C++移动构造创建出来的unique_ptr
    变量只有移动,没有深拷贝
    想要深拷贝,需要调用 clone()方法
    同时,和C++ 表现一样,对于内置类型(基础类型),直接拷贝就好了。。。。

由于这玩意儿表现形式就是unique_ptr,所以在函数调用上,就会很恶心,

现成的解决栗子就是C常用的引用和解引用

引用与解引用

表现形式和C++,一毛一样。。。。,

不过这里有个小细节:C++定义函数参数的时候,常常使用的 const &,

在rust中是默认 const &, 想要修改参数,需要加上 mut关键字。

限制:

  • 同一作用域,特定数据只能有一个可变引用

  • 可变引用与不可变引用不能同时存在

防御性编程到极致了。。。:

数据竞争:

  • 两个或更多的指针同时访问同一数据
  • 至少有一个指针被用来写入数据
  • 没有同步数据访问的机制

引用使用方式

  • 同一时刻,你只能拥有要么一个可变引用, 要么任意多个不可变引用
  • 引用必须总是有效的
相关推荐
heimeiyingwang14 分钟前
【架构实战】Kubernetes网络模型深度解析:从Pod通信到Ingress网关实战
开发语言·架构·php
gis开发之家27 分钟前
Spring Boot 4 深度解析——参数接收大全:@RequestParam、@PathVariable、@RequestBody
java·spring boot·后端·spring
NutShell Wang28 分钟前
Rust 1.97 实战迁移:v0 符号重整、Cargo 警告治理与位运算新 API
人工智能·后端·性能优化·rust·vibe coding
阑梦清川38 分钟前
零成本把笔记转成双人播客:WorkBuddy + 腾讯云 TTS 完整教程
后端
赫媒派40 分钟前
Go 1.27 来了:泛型方法补齐,JSON 提速不踩坑
后端·go·敏捷开发
不ok哥男人40 分钟前
C# Roslyn 编译器平台实战:源生成器、分析器与代码修补
后端
长栎40 分钟前
99% 的人把桥接模式当策略模式用——抽象与实现分离,你做的不是同一件事
后端
长栎42 分钟前
你激活了 sharp-skills 一个模块,但你的项目从来不是单点活儿
后端
Lcos1 小时前
Kubernetes Toleration 六种写法详解:从精确匹配到全部放行
后端
元界metalite1 小时前
MyBatis事务只能靠Transactional吗-MetaLite为何只保留编程式事务
后端