其他语言的内存管理
现代语言内存管理分为两大类。
其一为gc类:通过垃圾回收机制来管理内存。gc先开一大块内存,然后在那一块内存里面自己分配。然后等到引用计数器为0,或者没有指针指向它(可以简单的理解为这个对象之后没有被使用了,虽然不太准确,)。比如java,python,以及其他主流语言都是这么做的。
其二为"C"类:也就是自己控制内存,自己申请内存,自己释放,也就是c和c++。
两者的优略为。前者gc控制,那么开发者只需要开摆,也就是什么都不用管。全部交给gc来处理。这么做的好处就是节省脑力,不需要考虑什么申请空间,创建指针这种操作,直接new对象完了。略势就不用多说,你无法准确的控制内存(就像你租房东的房子一样,你可以重新装修住进去,或者你好好打扫你的房间,管理你租用的领域。(很明显对于绝对多数人,都不会这样做,做的很好)),以及浪费内存。当然现在内存也不昂贵,所以浪费内存几乎可以忽视(指大多互联网领域)。
而后者的优势很明显:你能做任何你想做的事情,创建指针,释放掉它。当然在这个过程中你可能突然创建出没有父亲的野孩子。
以下是以表格的形式列出他们的区别:
| C | 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就指向了空气。无法使用了。这就是所有权

2166

被折叠的 条评论
为什么被折叠?



