Rust开发笔记 | 所有权系统及其对内存管理的影响

Rust 是一门以系统编程为主要应用场景的编程语言,它提供了无需垃圾回收机制就能安全实现内存管理的特性。其中,所有权(Ownership)系统是 Rust 语言最核心的特点之一,它能够保证内存安全,同时避免数据竞争。下面,我们将深入探究 Rust 中所有权的概念、规则以及它与借用和切片所起到的作用。

所有权的基本原则

在 Rust 中,所有权系统基于三个基本原则:

  1. 每一个值在 Rust 中都有一个被称为其‘所有者’的变量。
  2. 值在任一时刻只能有一个所有者。
  3. 当所有者超出作用域时,该值会被自动丢弃(drop)。

所有者和作用域

例如:

{
    let s = String::from("hello"); // s 进入作用域
}                                  // s 超出作用域,同时 `String` 类型的内置方法 drop 被自动调用,内存被释放

此时,s"hello" 这段数据的所有者。当 s 超出花括号包围的区域,它就超出了作用域,Rust 自动为我们调用 drop 函数,释放内存。

变量与数据交互的方式:移动(Move)

let s1 = String::from("hello");
let s2 = s1;

在这个例子中,s1 的数据似乎被复制给了 s2。然而,在 Rust 中,这里会发生所谓的移动。事实上,s1 的所有权被移动到 s2,之后 s1 将无效且不能再被使用。

借用(Borrowing)

借用是 Rust 用来允许你使用某个值,但不取得其所有权的机制。通过引用(&T)的方式实现,可以是不可变引用或可变引用:

不可变引用

fn main() {
    let s1 = String::from("hello");
    calculate_length(&s1);
}

fn calculate_length(s: &String) -> usize {
    s.len()
}

此时,s1 将一个指向 String 的不可变引用传递给函数 calculate_length,但并不放弃所有权。

可变引用

fn main() {
    let mut s = String::from("hello");
    change(&mut s);
}

fn change(some_string: &mut String) {
    some_string.push_str(", world");
}

在这里,我们使用可变引用 &mut String 来修改 s。借出的期间内,原变量的所有权并未改变,只是暂时允许别的代码片段对数据进行修改。

注意:在特定作用域中的特定数据只能有一个活跃的可变引用,以防止数据竞争。不可变引用则可以有多个,但不能与可变引用同时存在。

切片(Slices)

切片类型让你可以引用集合中一段连续的元素序列,而不用引用整个集合。例如,对字符串切片:

fn main() {
    let s = String::from("hello world");
    let hello = &s[0..5];
    let world = &s[6..11];
}

这里 helloworld 是切片,它们引用了原字符串 s 的一部分数据。与前面的引用一样,切片也不拥有实际的数据,只是临时借用。

所有权、借用和切片共同作用于 Rust 的内存管理中,它们确保了内存安全,防止了例如空指针、悬垂指针等一系列问题的发生。此外,所有权系统使得 Rust 无需垃圾回收机制,从而使程序性能得到提升。通过学习与深入理解这些概念,开发者能够写出更安全、高效的 Rust 代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/558143.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

豆瓣影评信息爬取 (爬虫)

代码块: from lxml import etree import requestsheaders{User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 Edg/123.0.0.0 }url_list[] for i in range(0,5):i*20urlsf"https:…

day02-新增员工

day01 新增员工业务逻辑整理 EmployeeController.java PostMappingApiOperation("新增员工")public Result save(RequestBody EmployeeDTO employeeDTO){System.out.println("当前线程的ID:" Thread.currentThread().getId());log.info("新增员工&a…

[leetcode] 56. 合并区间

文章目录 题目描述解题方法排序java代码复杂度分析 题目描述 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区…

UWB人员定位系统适用的场景有哪些?​​​​​​​10厘米工业级实时轨迹高精度定位

UWB人员定位系统适用的场景有哪些?10厘米工业级实时轨迹高精度定位 一、应用场景 1、商场与零售领域:商场可以使用UWB人员定位系统来跟踪顾客的行踪,以收集顾客行为数据,为营销策略提供有力支持。帮助商场优化商品布局和陈列&…

在龙梦迷你电脑福珑2.0上使用Fedora 28 龙梦版

在龙梦迷你电脑福珑2.0上使用Fedora 28 龙梦版。这个版本的操作系统ISO文件是:Fedora28_for_loongson_MATE_Live_7.2.iso 。它在功能方面不错。能放音乐,能看cctv直播,有声音,能录屏,能在局域网里用PuTTY的ssh方式连接…

【Java EE】依赖注入DI详解

文章目录 🌴什么是依赖注入🍀依赖注入的三种方法🌸属性注入(Field Injection)🌸构造方法注入🌸Setter注入🌸三种注入优缺点分析 🌳Autowired存在的问题🌲解决Autowired对应多个对象问…

dp思维 枚举

题目链接 #include<bits/stdc.h> using namespace std; #define i64 long long const i64 mod 1e9 7; int main() {int n;cin >> n;vector<char>s(n 1);for (int i 1; i < n; i) {cin >> s[i];}//用ans记录所有满足条件的答案数量&#xff0c;c…

SQL增加主键约束的条件

结论 常见认为设为主键的条件为&#xff1a; 值唯一不含空值 具体实施中会出现各种问题 添加主键约束的条件细则&#xff1a; 值唯一数据中不含空值在定义时需要not null约束&#xff08;使用check约束不行&#xff09; 验证实验 接下来我做了关于这个细则的验证实验&am…

万物皆可计算|下一个风口:近内存计算-2

虽然PIM可以有缓解内存墙的问题&#xff0c;但是PIM设计面临着一系列技术和工程上的挑战&#xff0c;这些挑战直接影响着PIM技术的实用化和广泛应用&#xff1a; 地址翻译与操作映射&#xff1a; 在传统计算机体系结构中&#xff0c;地址空间由操作系统管理和调度&#xff0c;通…

万物皆可计算|下一个风口:近内存计算-1

传统的冯诺依曼架构虽然广泛应用于各类计算系统&#xff0c;但其分离的数据存储与处理单元导致了数据传输瓶颈&#xff0c;特别是在处理内存密集型任务时&#xff0c;CPU或GPU需要频繁地从内存中读取数据进行运算&#xff0c;然后再将结果写回内存&#xff0c;这一过程涉及大量…

Vue3:响应式数据的基本使用(ref、reactive)

一、前言 在Vue3中&#xff0c;如果数据不是响应式数据&#xff0c;当数据的值发生改变时&#xff0c;页面上的数据是不会发生改变的。因此本文主要介绍Vue3中响应式数据的使用&#xff0c;包括ref和reactive的基本使用。 二、ref 1、ref —— 创建基本类型的响应式数据 re…

电大搜题微信公众号:重庆开放大学学子的学习利器

在当今信息化时代&#xff0c;学习已经成为每个人不可或缺的一部分。然而&#xff0c;对于重庆开放大学的学子们来说&#xff0c;由于远程教育的特殊性&#xff0c;他们面临着更大的学习挑战。幸运的是&#xff0c;他们现在可以依靠一款强大的学习利器——电大搜题微信公众号&a…

软考中级网络工程师-2024上岸宝典

1.软考是什么 简单说就是计算机技术 相关的国家级证书考试&#xff0c;想听专业点给大家截一张官网的图&#xff0c;不想听废话直接往下。 同为国家级证书的&#xff1a;注册会计师、法律职业资格证、一级建筑师&#xff0c;证书的价值是比较高的。 很多人都是在求职前或者大…

【面试经典 150 | 二叉树层序遍历】二叉树的右视图

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;层序遍历方法二&#xff1a;深度优先搜索 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于…

全球媒体发稿:海外发稿数字期刊Digital Journal

全球媒体发稿&#xff1a;海外发稿数字期刊Digital Journal ​官网&#xff1a; digitaljournal.com 数字期刊&#xff0c;加拿大知名门户&#xff0c;月访量超过30万。 是一个全球媒体平台和内容合作伙伴&#xff0c;通过捕捉和报道第一&#xff0c;提升新闻周期中的声…

快手本地生活服务商系统怎么操作?

当下&#xff0c;抖音和快手两大短视频巨头都已开始布局本地生活服务&#xff0c;想要在这一板块争得一席之地。而这也很多普通人看到了机遇&#xff0c;选择成为抖音和快手的本地生活服务商&#xff0c;通过将商家引进平台&#xff0c;并向其提供代运营服务&#xff0c;而成功…

工厂数字化系统是自研,还是对外采购

数字化转型在企业中变得越来越普遍&#xff0c;众多数字化项目的增加也引发了自研和采购数字化系统的讨论。自研和采购各有优劣&#xff0c;需要根据企业的实际情况和需求来做出明智的选择。 自研数字化系统 适用情况&#xff1a;重要核心业务、复用率高、需要长期优化迭代的系…

用队列实现栈(力扣第225题)

#include "stdio.h" #include "stdbool.h" #include "string.h" #include "stdlib.h" #include "assert.h"//初始化队列 typedef int QueueDataType;typedef struct queue {QueueDataType val;struct queue* next; }Qnode;t…

符文协议的演变历程:从挑战到创新

在比特币网络长期面临的挑战中&#xff0c;与主流去中心化金融功能的兼容性一直是一大难题。相比之下&#xff0c;以太坊通过ERC-721和ERC-1155代币标准&#xff0c;为NFT和去中心化金融应用提供了支持&#xff0c;而比特币的应用范围却相对有限。然而&#xff0c;近年来&#…

Linux知识点(4)

文章目录 13. 线程13.1 什么是线程13.2 Linux下的线程13.2.1 pthread_create13.2.2 线程为什么高效&#xff1f;13.2.3 线程的优缺点13.2.4 线程异常13.2.5 线程用途 13.4 虚拟地址空间13.5 Linux线程控制13.5.1 POSIX线程库13.5.2 创建线程13.5.3 线程ID及进程地址空间布局13.…
最新文章