作者:京东零售 王梦津

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. HDC.Cloud2021|开发者们都在谈的云原生到底长什么样?

    摘要:云原生数据库基于存储与计算分离架构,与传统数据库相比,具备高性能.高扩展.一致性.易管理和多云支持等特性,在海量数据处理.智能存储.业务应用等方面表现出了强大的生命力. 近几年,云原生的风越刮越 ...

  2. 关于单元测试的那些事儿,Mockito 都能帮你解决

    摘要:相信每一个程序猿在写Unit Test的时候都会碰到一些令人头疼的问题:如何测试一个rest接口:如何测试一个包含客户端调用服务端的复杂方法:如何测试一个包含从数据库读取数据的复杂方法...这些 ...

  3. 知道ThreadLocal吗?一起聊聊到底有啥用

    摘要:ThreadLocal是 java 提供的一个方便对象在本线程内不同方法中传递和获取的类.用它定义的变量,仅在本线程中可见和维护,不受其他线程的影响,与其他线程相互隔离. 本文分享自华为云社区& ...

  4. 字节跳动基于ClickHouse优化实践之“资源隔离”

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 相信大家都对大名鼎鼎的 ClickHouse 有一定的了解了,它强大的数据分析性能让人印象深刻.但在字节大量生产使 ...

  5. 火山引擎 EMR StarRocks 场景案例分享

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 日前 ,火山引擎数智平台(VeDI)旗下产品 E-MapReduce(简称"EMR")正式上线 ...

  6. SpringBoot 自定义初始化任务 Runner

    在项目启动的时候需要做一些初始化的操作,比如初始化线程池,提前加载好加密证书等.可以通过实现Runner接口完成以上工作. 两者只是参数上的区别 方式一 实现 CommandLineRunner 接口 ...

  7. You are not using binary logging

    Error Code : 1381You are not using binary logging show variables like '%log_bin%'; 在mysqld配置项下面加上log ...

  8. 阿里云的“终端云化”实践,基于ENS进行边缘架构构建

    终端无休止的更新迭代,是软件对计算资源的需求激增. 作者|王广芳 编辑|IMMENSE 终端云化:打破硬件的桎梏 近几年,"终端云化"技术开始规模化落地,其核心思想是"计 ...

  9. CodeForces - 469A I Wanna Be the Guy

    There is a game called "I Wanna Be the Guy", consisting of n levels. Little X and his frie ...

  10. Java ConcurrentHashMap 高并发安全实现原理解析

    本文首发于 vivo互联网技术 微信公众号链接:https://mp.weixin.qq.com/s/4sz6sTPvBigR_1g8piFxug作者:vivo 游戏技术团队 一.概述 Concurr ...