RUST的所有权以及内存管理

其他语言的内存管理

现代语言内存管理分为两大类。

其一为gc类:通过垃圾回收机制来管理内存。gc先开一大块内存,然后在那一块内存里面自己分配。然后等到引用计数器为0,或者没有指针指向它(可以简单的理解为这个对象之后没有被使用了,虽然不太准确,)。比如java,python,以及其他主流语言都是这么做的。

其二为"C"类:也就是自己控制内存,自己申请内存,自己释放,也就是c和c++。

两者的优略为。前者gc控制,那么开发者只需要开摆,也就是什么都不用管。全部交给gc来处理。这么做的好处就是节省脑力,不需要考虑什么申请空间,创建指针这种操作,直接new对象完了。略势就不用多说,你无法准确的控制内存(就像你租房东的房子一样,你可以重新装修住进去,或者你好好打扫你的房间,管理你租用的领域。(很明显对于绝对多数人,都不会这样做,做的很好)),以及浪费内存。当然现在内存也不昂贵,所以浪费内存几乎可以忽视(指大多互联网领域)。

而后者的优势很明显:你能做任何你想做的事情,创建指针,释放掉它。当然在这个过程中你可能突然创建出没有父亲的野孩子。

以下是以表格的形式列出他们的区别:

GC
优势手动控制内存提供了极大的灵活性,
程序员完全控制内存的分配和释放,能够精确控制性能,适用于低层次的系统编程。
自动内存管理GC 自动回收不再使用的内存
,开发者无需手动干预。对于大多数应用程序,开发者可以专注于业务逻辑而不必担心内存管理。
零运行时开销 没有垃圾回收
,因此在时间和空间效率上非常高,适合性能要求极为严格的应用(如嵌入式系统)。
内存安全性GC 可以有效避免内存泄漏和悬空指针的问题
(虽然不能完全避免,垃圾回收机制较为健壮)。
简化开发因为不需要显式的内存管理,
开发者不必处理复杂的内存分配和释放逻辑,可以提高开发效率。
劣势内存泄漏和悬空指针问题由于没有自动内存管理,开发者必须手动释放内存,容易发生内存泄漏(未释放内存)或悬空指针(使用已释放内存)。这些问题往往会导致严重的程序崩溃和难以排查的 bug。性能开销GC 会在程序运行过程中定期触发回收,这可能会导致应用程序出现短暂的停顿。虽然现代的垃圾回收器(如 Go 的垃圾回收器)已尽可能减少停顿时间,但在高性能场景中,这仍然是一个不可忽视的问题。
容易出错手动管理内存增加了出错的机会,尤其是在复杂的程序中,需要小心管理每一块内存,避免遗漏释放不可预测的延迟GC 的执行时间和间隔通常是不可预测的,
这可能会导致某些应用程序(如实时系统或高频交易)遇到性能瓶颈。
内存消耗GC 需要额外的内存来跟踪对象的引用和状态,
这会增加内存的使用量。

        总结一下就是,一个性能高不安全,一个安全简单性能不太行。给所有的程序员一个机会,或者给所有人一个机会,你们会选择什么。

        那毫无疑问是我既要又要,我既要性能也要安全。回归正题,那么就是RUST做出的选择。

RUST的内存管理。 

        话又说回来,一切都是有代价的。那么古尔丹代价是什么呢。代价就是沉痛的心智负担,RUST的编译器严格规范了你的使用。规范的代价就是,学习起来的痛苦,你需要理解所有权,借用引用,以至于生命周期,才能很好的使用。(当然你可以说我C++也可以规范,这种规范的外部限制。你可能还得有熟练的踩坑经验。这样才能很好的避免风险。从某种角度来说C++ + 约束 = RUST,你需要有C经验才能比较好上手,这也就是为什么Other学习起来比较奇怪)

具体区别

所有权

        所有权每一个值同一时间,只有一个所有者。即一夫一妻制度,每一个老婆都对应一个老公。他们会同时存在同时消失。

        像上面 2 - 5 行,第 5 行 执行完,他们两个就自动回收了,(其他语言是离开作用域就失效了,这里是失效+回收,可以理解为这里GC自动回收了内存上的变量。)

        第 6 - 10 行,第10行报错了。因为一夫一妻制度,然后有一个人要抢走你的老婆,你能忍麻,很明显不能忍,编译器(公安局)直接逮捕了这个错误。

复制变量

复制变量的时候,先说c吧。

假定有这么一段代码

hello = "hello_world";

hello1 = hello;

hello2 = hello;

c是复制变量的时候是拷贝一份变量,然后赋值。如下图,这样是很浪费系统资源的。因为你每一次都会开辟内存空间,然后copy一份。如果数据量很大,对于系统来说就不是很友好了。

来点灵魂画作

java系的就是用一个计数器,你每有一个引用,那么我就给你的计数器+1。实际使用的同一块堆空间,除非你是深拷贝。这种有好处,快啊。

那么RUST呢。堆空间还是同一块,但是所有权已经变。因为共享的同一块内存,为了安全,牺牲了便利,这个时候,你的hello,hello就指向了空气。无法使用了。这就是所有权

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值