rust入坑指南之ownership

author author     2023-02-16     803

关键词:

作者:京东零售 王梦津

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入坑指南:坑主驾到(代码片段)

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

rust入坑指南:齐头并进(下)(代码片段)

前文中我们聊了Rust如何管理线程以及如何利用Rust中的锁进行编程。今天我们继续学习并发编程,原子类型许多编程语言都会提供原子类型,Rust也不例外,在前文中我们聊了Rust中锁的使用,有了锁,就要小心死锁的问题,Rust虽... 查看详情

rust入坑指南:海纳百川(代码片段)

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

rust入坑指南:步步为营(代码片段)

俗话说:“测试写得好,奖金少不了。”有经验的开发人员通常会通过单元测试来保证代码基本逻辑的正确性。如果你是一名新手开发者,并且还没体会到单元测试的好处,那么建议你先读一下我之前的一篇文章代码洁癖系列(... 查看详情

docker入坑指南之run(代码片段)

...了,启动便捷,镜像还原很快捷,除了上手不容易。最近入坑研究了一番,小有心得,故写一篇杂文,记录自己的踩坑经历。安装Docker的过程可以参考其他前辈的文章,不再赘述,从实战角度说,如何构建一个自用的Docker镜像。... 查看详情

docker入坑指南之exec(代码片段)

容器启动之后,如果我们需要进入容器内修改配置,比如mysql修改启动配置我们启动的附加参数是不是shell,这个时候就可以用dockerexec了,docker除了对image参数以外,大部分命令,可以多docker容器ID操作的,也可以对docker容器别名... 查看详情

youcompleteme入坑指南

本文记录自己安装YouCompleteMe(简称YCM)这款VIM插件的过程,主要目的是记录出错情况和解决方法。YCM号称史上最难装vim插件,根据我的安装经验,此言不虚。得知其强大之时,我便不假思索开始安装。我所用的系统为CentOS6.8,... 查看详情

杂记rust的destructuringbinding(反结构化绑定)与ownership(所有权)(代码片段)

...(first,second)=self;//这里self不再可见以前听说过rust的lifetime,ownership,看着样子估计就是这方面的问题导致的特性。尝试我大概理解了它的行为,let反结构化绑定有点类似于c++的std::move()?于是做了点实验。#[derive(Debug)]structAx:i32,y:i32... 查看详情

weex入坑指南

weexcreatenewtest    然后在某个阶段卡死,  解决方案:在路径下创建新建文件夹,并命名为项目的名称。  查看详情

网络安全入坑指南(授课版)

...周末,我做了一场两天两夜的技术公开课,包括网络安全入坑指南、(入门导论、行业解读、学习指南)网络安全攻击与防御、渗透测试入门、WiFi无线攻防等课题,目前部分授课视频已经上传到拼客学院网校,有兴趣的小伙伴... 查看详情

laravel入坑指南——数据迁移与填充

当我们开发完成一个(小)项目,发布到线上时,我们需要将本地数据库迁移到服务器上,并且填充初始化数据。而Laravel框架规定了一套完善的数据迁移与填充机制。在官网中分别介绍了以下四个命令:phpartisanmake:migration ph... 查看详情

nw.js入坑指南

NW.js是什么?NW.js是基于 Chromium 和 Node.js 运行的,以前也叫nodeWebkit。这就给了你使用HTML和JavaScript来制作桌面应用的可能。在应用里你可以直接调用Node.js的各种api以及现有的第三方包。因为Chromium和 Node.js ... 查看详情

jquery入坑指南

前言  Ajax官方文档  爱jQuery  jQuery插件库  jQuery中文apiinput赋值和取值记录一下:在写一个input赋值,二话不说就直接利用了$(‘#xx‘).val()来进行取值和赋值,取值ok,赋值后利用alert显示正确,但是在... 查看详情

megacli入坑指南

MegaCli是LSI公司官方提供的SCSI卡管理工具,由于LSI被收购变成了现在的Broadcom,所以现在想下载MegaCli,需要去Broadcom官网查找Legacy产品支持,搜索MegaRAID即可。 现在官方有storcli,整合了LSI和3ware所有产品。但是个人认为Megacli... 查看详情

megacli入坑指南

MegaCli是LSI公司官方提供的SCSI卡管理工具,由于LSI被收购变成了现在的Broadcom,所以现在想下载MegaCli,需要去Broadcom官网查找Legacy产品支持,搜索MegaRAID即可。 现在官方有storcli,整合了LSI和3ware所有产品。但是个人认为Megacli... 查看详情

openstack入坑指南

 什么是云计算概念云计算是一种基于互联网的计算方式,通过这种方式,共享的软硬件资源和信息,可以按需求提供给计算机和其他设备。用户不需要了解”云“中的基础设施细节,不必具有相应的专业知识,也无需... 查看详情

rust编程指南02-进入rust语言世界(代码片段)

原文链接:https://wayto.rs/about-book.html 欢迎大家加入Rust编程学院,中国最好的Rust学习社区官网:https://college.rsQQ群:1009730433进入Rust编程世界一、Rust发展历程Rust最早是Mozilla雇员GraydonHoare的一个个人项目,从2009... 查看详情

react-native环境配置入坑指南.

官方入门教程:https://reactnative.cn/docs/0.51/getting-started.htmlhttp://services.gradle.org/distributions/1.安装好javasdk,andriodsdk,androidstudio。2.配置环境变量。3.下载一个gradle,并修改为本地离线下载4.react-nativerun-android调试ad 查看详情