作者:京东零售 王梦津

I. 前言

Rust,不少程序员的白月光,这里我们简单罗列一些大牛的评价。

Linus Torvalds:Linux内核的创始人,对Rust的评价是:“Rust的主要优点是代码的安全性和速度,很难在C++中实现这种安全性,而且Rust编译器会捕获很多C++难以发现的错误”。

Brian Kernighan:C语言的创始人之一,对Rust的评价是:“Rust是一门非常强大的程序语言,在资源管理、内存安全、多线程等方面具有很强的能力”。

Rob Pike:Go语言的创始人之一,对Rust的评价是:“Rust是一门很有前途的语言,它将许多最佳实践和先进技术整合在了一起,是未来系统编程的重要选择”。

越来越多大学的课程设计中也将rust作为了一个选项,

比如获得国家精品课程的清华大学的操作系统: http://rcore-os.cn/rCore-Tutorial-Book-v3/

如果上面这些让你对rust感兴趣了的话,可以移步官方学习链接:https://doc.rust-lang.org/book/

II. Rust Ownership概述

这篇文章我们介绍一下rust的一个核心概念 ownership

Ownership是Rust语言的一个核心概念,它决定了一个值在程序中的生命周期以及对其访问权限的限制。Rust的Ownership有以下几个特点:

Rust有严格的内存安全性:Ownership规则决定了在程序中每一个值的生命周期,因此在Rust程序中不存在内存泄漏和数据竞争问题。

Rust是一种静态语言:在编译阶段就可以确定程序中每一个值的生命周期,因此程序的性能是非常稳定的。

明确的资源管理:Ownership规则决定了程序中的资源如何被分配,释放和管理,因此程序员不必手动进行内存管理。

总的来说,Rust的Ownership提供了一种通过明确的规则管理内存和资源的方式,从而避免了许多常见的编程错误,使程序员能够开发出更安全,高效,可靠的程序。

III. Ownership的代码实践

// Rust代码
fn main() {
let v = vec![1, 2, 3];
let _v2 = v;
println!("{:?}", v);
}

上面的 Rust 代码会产生编译错误,因为在 Rust 中一个变量只能有一个所有者。在本代码中,当将 v 赋值给变量 v2 时,v 就不再拥有它分配的内存,所以 v 不能被使用。相比之下,C++代码是这样的:

#include <vector>
#include <iostream> int main() {
std::vector<int> v = {1, 2, 3};
std::vector<int> v2 = v;
std::cout << v[0] << std::endl;
return 0;
}

这段 C++ 代码不会产生任何错误,即使 v 被赋值给 v2,v 仍然可以被使用。这是因为 C++ 使用垃圾回收机制,它在运行时才检测到内存问题,而 Rust 使用编译期所有权管理机制,可以在编译阶段发现内存问题,更安全。

IV. Ownership与内存管理

首先和c++相比

C++不提供类似于Rust Ownership的特性主要是因为C++语言的历史和设计目标的差异。C++在更早的时代就已经存在,并且它的目标是在C语言的基础上增加面向对象编程的支持。它的目标是提供最大的灵活性和可控性,以便开发人员可以最大限度地利用系统资源和高效的底层操作。因此,在C++中,内存管理的责任主要在开发人员的身上。

而Rust语言则在现代编程语言中引入了Ownership概念,其目标是通过对内存管理和资源管理的严格限制来提高代码的安全性和可靠性。在Rust语言中,Ownership机制可以防止很多常见的编程错误,例如悬空指针、数组越界、使用已释放的内存等。因此,如果C++也想要实现类似的特性,那么它必须从语言设计的角度进行许多改变,而这在当前已经有大量C++代码存在的情况下是很困难的。

总之,C++和Rust语言的内存管理和Ownership特性之间的差异主要是由于两种语言的历史和目标不同导致的。C++更注重开发人员的灵活性和可控性。

和我们熟悉的jvm垃圾回收相比

设计目标:Rust Ownership 旨在在编译时避免内存问题,例如空间泄漏和使用释放的对象,并保证程序的安全性和性能。相比之下,JVM 垃圾回收则是在运行时管理内存的机制,旨在解决内存泄漏和碎片化问题。

编程体验:Rust Ownership 需要程序员经常手动管理对象的生命周期,对语法要求比较高。相比之下,JVM 垃圾回收则不需要程序员进行内存管理,但是运行时可能会因垃圾回收带来性能问题。

内存安全:Rust Ownership 通过在编译时避免内存问题,提供了更高的内存安全保证。相比之下,JVM 垃圾回收可能存在内存问题,例如内存泄漏,但通常情况下还是比较安全的。

性能:Rust Ownership 可以通过避免编译时避免内存问题来提高性能。相比之下,JVM 垃圾回收的性能可能会受到垃圾回收带来的影响,但它仍然可以通过其他方式优化性能。

V. 总结

本文介绍了Ownership的概念、特点和优势。

让熟悉JVM生态的我们了解了另一个生态下更加显式的内存管理、高效的内存分配以及代码安全性和可读性的设计思路,也同时告诉了我们程序语言的设计上对于成本、效率永无止境的追求。

rust入坑指南之ownership的更多相关文章

  1. Rust入坑指南:核心概念

    如果说前面的坑我们一直在用小铲子挖的话,那么今天的坑就是用挖掘机挖的. 今天要介绍的是Rust的一个核心概念:Ownership.全文将分为什么是Ownership以及Ownership的传递类型两部 ...

  2. Rust入坑指南:鳞次栉比

    很久没有挖Rust的坑啦,今天来挖一些排列整齐的坑.没错,就是要介绍一些集合类型的数据类型."鳞次栉比"这个标题是不是显得很有文化? 在Rust入坑指南:常规套路一文中我们已经介绍 ...

  3. Rust入坑指南:朝生暮死

    今天想和大家一起把我们之前挖的坑再刨深一些.在Java中,一个对象能存活多久全靠JVM来决定,程序员并不需要去关心对象的生命周期,但是在Rust中就大不相同,一个对象从生到死我们都需要掌握的很清楚. ...

  4. Rust入坑指南:亡羊补牢

    如果你已经开始学习Rust,相信你已经体会过Rust编译器的强大.它可以帮助你避免程序中的大部分错误,但是编译器也不是万能的,如果程序写的不恰当,还是会发生错误,让程序崩溃.所以今天我们就来聊一聊Ru ...

  5. Rust入坑指南:齐头并进(上)

    我们知道,如今CPU的计算能力已经非常强大,其速度比内存要高出许多个数量级.为了充分利用CPU资源,多数编程语言都提供了并发编程的能力,Rust也不例外. 聊到并发,就离不开多进程和多线程这两个概念. ...

  6. Rust入坑指南:常规套路

    搭建好了开发环境之后,就算是正式跳进Rust的坑了,今天我就要开始继续向下挖了. 由于我们初来乍到 ,对Rust还不熟悉,所以我决定先走一遍常规套路. 变不变的变量 学习一门语言第一个要了解的当然就是 ...

  7. Rust入坑指南:坑主驾到

    欢迎大家和我一起入坑Rust,以后我就是坑主,我主要负责在前面挖坑,各位可以在上面看,有手痒的也可以和我一起挖.这个坑到底有多深?我也不知道,我是抱着有多深就挖多深的心态来的,下面我先跳了,各位请随意 ...

  8. Rust入坑指南:千人千构

    坑越来越深了,在坑里的同学让我看到你们的双手! 前面我们聊过了Rust最基本的几种数据类型.不知道你还记不记得,如果不记得可以先复习一下.上一个坑挖好以后,有同学私信我说坑太深了,下来的时候差点崴了脚 ...

  9. Rust入坑指南:有条不紊

    随着我们的坑越来越多,越来越大,我们必须要对各种坑进行管理了.Rust为我们提供了一套坑务管理系统,方便大家有条不紊的寻找.管理.填埋自己的各种坑. Rust提供给我们一些管理代码的特性: Packa ...

  10. Rust入坑指南:海纳百川

    今天来聊Rust中两个重要的概念:泛型和trait.很多编程语言都支持泛型,Rust也不例外,相信大家对泛型也都比较熟悉,它可以表示任意一种数据类型.trait同样不是Rust所特有的特性,它借鉴于H ...

随机推荐

  1. OpenCV萌新福音:易上手的数字识别实践案例

    摘要:信用卡识别的案例用到了图像处理的一些基本操作,对刚上手CV的人来说还是比较友好的. 本文分享自华为云社区<Python openCV案例:信用卡数字识别>,原文作者:深蓝的回音 . ...

  2. 用 Java?试试国产轻量的 Solon v1.10.7

    Java 国产的轻量级应用开发框架.可用来快速开发 Java 应用项目.主框架仅 0.1 MB.Helloworld: @Controller public class App { public st ...

  3. bat cmd 无效参数/选项 - deleting

    Window bat expdp 数据库定时任务逻辑备份数据库 定时删除N天前的旧文件 Linux shell crontab expdp 定时任务逻辑备份数据库 定时删除旧文件 错误配置 forfi ...

  4. Kubernetes(K8S) Service 介绍

    定义一组 Pod 的访问规则 存在的意义 防止 Pod 失联(服务发现),Pod 重启后,IP会变 定义一组 Pod 访问策略,负载均衡 Pod 和 Service 关系 根据 label 和 sel ...

  5. MySQL 创建存储过程注意项

    MySQL server version for the  right syntax to use near 'IF' MySQL server version for the right synta ...

  6. django基本流程

    创建项目 django-admin startproject web cd web python manage.py startapp weblist 生成迁移文件 python manage.py ...

  7. Grafana--变量(label_values)

    grafana官方文档:https://grafana.com/docs/grafana/latest/ 版本:6.5.2 模板与变量(摘抄自官方文档): 变量是值的占位符.您可以在度量查询和面板标题 ...

  8. (转)Github+jsDelivr+PicGo 打造稳定快速、高效免费图床

    转载自:https://www.itrhx.com/2019/08/01/A27-image-hosting/ 写在开头,之前我是使用Gitee作为图床和Picgo搭配使用的 (图片不允许超过1MB) ...

  9. 2016年第七届 蓝桥杯A组 C/C++决赛题解

    蓝桥杯历年国赛真题汇总:Here 1.随意组合 小明被绑架到X星球的巫师W那里. 其时,W正在玩弄两组数据 (2 3 5 8) 和 (1 4 6 7) 他命令小明从一组数据中分别取数与另一组中的数配对 ...

  10. 【每日一题】27. 过河 (DP + 离散化)

    补题链接:Here 算法涉及:DP + 离散化 \(l\) 的范围太大,无法作为数组下标,所以先离散化,再DP.两点间的距离d大于t时,一定可以由 \(d\ \%\ t\) 跳过来,所以最多只需要t+ ...