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.mzph.cn/news/821732.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 试图

视图功能在 5.0 以后的版本启用 视图是一张虚表。数据表确实包含了具体数据并且保存到硬盘中的实表。视图使用数据检索语句动态生 成的一张虚表。每一次数据服务重启或者系统重启之后,在数据库服务启动期间,会使用创建视图的语 句重新生成视图中的数据&…

详解UART通信协议以及FPGA实现

文章目录 一、UART概述二、UART协议帧格式2.1 波特率2.2 奇校验ODD2.3 偶校验EVEN 三、UART接收器设计3.1 接收时序图3.2 Verilog代码3.3 仿真文件测试3.4 仿真结果3.5 上版测试 四、UART发送器设计4.1 发送时序图4.2 Verilog代码4.3 仿真文件测试4.4 仿真结果4.5 上板测试 五、…

用html画一个睡觉的熊动画

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>睡觉的熊动画</title><link rel"stylesheet" href"./style.css"> </head><body><div id"contain…

免费的 ChatGPT、GPTs、AI绘画(国内版)

&#x1f525;博客主页&#xff1a;白云如幻❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ ChatGPT3.5、GPT4.0、GPTs、AI绘画相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容甚…

袁庭新ES系列14节 | 搭建Elasticsearch集群

前言 单节点的Elasticsearch需要在处理大量数据的时候需要消耗大量内存和CPU资源&#xff0c;数据量大到一定程度就会产生处理瓶颈&#xff0c;甚至会出现宕机。 为了解决单节点ES的处理能力的瓶颈及单节点故障问题&#xff0c;我们考虑使用Elasticsearch集群。接下来袁老师带…

【前后端的那些事】SpringBoot 基于内存的ip访问频率限制切面(RateLimiter)

文章目录 1. 什么是限流2. 常见的限流策略2.1 漏斗算法2.2 令牌桶算法2.3 次数统计 3. 令牌桶代码编写4. 接口测试5. 测试结果 1. 什么是限流 限流就是在用户访问次数庞大时&#xff0c;对系统资源的一种保护手段。高峰期&#xff0c;用户可能对某个接口的访问频率急剧升高&am…

【算法刷题day27】Leetcode:39. 组合总和、40. 组合总和 II、131. 分割回文串

文章目录 Leetcode 39. 组合总和解题思路代码总结 Leetcode 40. 组合总和 II解题思路代码总结 Leetcode 131. 分割回文串解题思路代码总结 草稿图网站 java的Deque Leetcode 39. 组合总和 题目&#xff1a;39. 组合总和 解析&#xff1a;代码随想录解析 解题思路 还是回溯三部…

记录一下易语言post get使用WinHttp的操作

最近在学易语言&#xff0c;在进行通讯的时候&#xff0c;出现一些问题&#xff0c;现在记录下来&#xff0c;避免以后继续忘记&#xff0c; 先声明文本型变量jsonPostData jsonPostData &#xff1d; “{hostname:” &#xff0b; hostnameTxt &#xff0b; “,hardcode:” &…

【ARM 裸机】I.MX 启动方式之启动头文件 2

接上一节&#xff1a;【ARM 裸机】I.MX 启动方式之启动头文件 1&#xff1b; 2.3、DCD DCD&#xff0c;Device Configuration Data &#xff0c;就是配置 6ULL 寄存器的&#xff0c;DCD 数据最大限制 1768 字节&#xff1b; CCGR0 是不是很熟悉&#xff1f;对&#xff0c;在…

【数据挖掘】课程大纲

第1章 数据挖掘基础 1.1 某知名连锁餐饮企业的困惑 1.2 从餐饮服务到数据挖掘 1.3 数据挖掘的基本任务 1.4 数据挖掘建模过程 1.4.1 定义挖掘目标 1.4.2 数据取样 1.4.3 数据探索 1.4.4 数据预处理 1.4.5 挖掘建…

在flask服务中远程读取该Excel的内容

在flask服务中远程读取该Excel的内容: from flask import Flask, jsonify import requests import pandas as pd import os import tempfile app Flask(__name__) app.route(/read_excel, methods[GET]) def read_excel(): # Excel 文件的 URL excel_url http…

选购AWS服务时需要注意哪些问题?九河云详细评测

随着云计算技术的广泛应用,亚马逊网络服务(AWS)受到越来越多企业的欢迎。这是因为他们提供了丰富的云计算产品和服务,可满足企业不同阶段的IT需求。但在选购AWS服务时,企业仍需谨慎考虑以下几个方面&#xff1a; 首先要确定自身的需求&#xff0c;并评估成本效益。企业在选择A…

Yarn--npm Windows安装使用

Yarn简介及Windows 在现代的Web开发中&#xff0c;JavaScript项目的依赖管理是一个复杂而重要的任务。幸运的是&#xff0c;我们有多种工具可以帮助我们处理这些依赖&#xff0c;其中之一就是Yarn。Yarn是一个由Facebook、Google、Tilde和Exponent联合开发的跨平台包管理工具&a…

【静态分析】软件分析课程实验-前置准备

课程&#xff1a;南京大学的《软件分析》课程 平台&#xff1a;Tai-e&#xff08;太阿&#xff09;实验作业平台 1. 实验概述 Tai-e 是一个分析 Java 程序的静态程序分析框架&#xff0c;相比于已有的知名静态程序分析框架&#xff08;如 Soot、Wala 等&#xff09;&#xf…

java的总结

由于最近已经开始做项目了&#xff0c;所以对java的基础知识的学习都是一个离散化的状态没有一个很系统的学习&#xff0c;都是哪里不会就去学哪里。 先来讲一下前后端的区别吧 在我的理解前端就是&#xff1a;客户端在前端进行点击输入数据&#xff0c;前端将这些数据整合起来…

AI智能体技术突破:引领科技新浪潮

AI智能体技术突破&#xff1a;引领科技新浪潮 基于大模型的 AI Agent 工作流基于大模型的 AI Agent 工作流效果AI Agent 的四种设计模式Reflection 反思设计模式Tool use 工具使用设计模式Planning 规划设计模式Multiagent collaboration 多智能体协作设计模式 吴恩达在红杉美国…

Flink CDC在阿里云DataWorks数据集成应用实践

摘要&#xff1a;本文整理自阿里云 DataWorks 数据集成团队的高级技术专家 王明亚&#xff08;云时&#xff09;老师在 Flink Forward Asia 2023 中数据集成专场的分享。内容主要为以下四部分&#xff1a; 阿里云 DataWorks 数据集成介绍基于 Flink CDC 数据集成新版引擎架构和…

AGI来了?特拉斯用大模型帮助自动驾驶

Elon Musk 的 xAI 刚刚推出了Grok-1.5 Vision&#xff0c;这是对开源模型的多模式升级&#xff0c;允许处理视觉信息。 细节&#xff1a; Grok 1.5V 现在可以处理文档、图表、屏幕截图和照片等视觉信息&#xff0c;重点是对现实世界的理解。 xAI 创建了一个新的“RealWorldQA”…

学习java第四十五天

Spring框架中有哪些不同类型的事件&#xff1f; 上下文更新事件&#xff08;ContextRefreshedEvent&#xff09;&#xff1a;在调用ConfigurableApplicationContext 接口中的refresh()方法时被触发。 上下文开始事件&#xff08;ContextStartedEvent&#xff09;&#xff1a;…

【鸿蒙开发】生命周期

1. UIAbility组件生命周期 UIAbility的生命周期包括Create、Foreground、Background、Destroy四个状态。 UIAbility生命周期状态 1.1 Create状态 Create状态为在应用加载过程中&#xff0c;UIAbility实例创建完成时触发&#xff0c;系统会调用onCreate()回调。可以在该回调中…