当前位置: 首页 > news >正文

rust 学习--所有权

所有权是rust的核心功能。

Rust 是通过所有权来管理内存回收的

栈(Stack)

  1. 栈是后进先出的

  2. 栈中存储的数据在编译时是固定内存大小的数据

  3. 数据移除栈叫出栈,数据存入栈叫入栈

  4. 入栈要比在堆上分配内存块,入栈时分配器无需为存储新数据去搜索内存空间,其位置总是在顶部

  5. 在调用一个函数的时候,传递给函数的值(包括可能指向堆上数据的指针)和函数的局部变量,都会被压入栈中,等函数结束时,这些值被移除栈。

堆(Heap)

  1. 堆中存储的数据在编译时是的大小是未知的。

  2. 堆在存储数据的时候需要向分配器先申请内存空间,并将空间标记为已使用状态,并返回一个表示该位置地址的 指针pointer

  3. 访问堆上的数据比访问栈上的数据要慢,因为必须通过指针来访问,现代处理器在内存中跳转越少就越快。

移动

rust中变量与数据交互的方式是移动,rust的移动和copy是不一样的,copy 后被copy的变量是不会失效的,但是移动,当a 移动到b的时候a变量就会失效。

引用

引用reference)像一个指针,因为它是一个地址,我们可以由此访问储存于该地址的属于其他变量的数据。 与指针不同,引用确保指向某个特定类型的有效值。

与使用 & 引用相反的操作是 解引用dereferencing),它使用解引用运算符,*。我们将会在第八章遇到一些解引用运算符,并在第十五章详细讨论解引用。

引用的规则

让我们概括一下之前对引用的讨论:

  • 在任意给定时间,要么 只能有一个可变引用,要么 只能有多个不可变引用。

  • 引用必须总是有效的。

所有权:

  • rust中每个值都有一个所有者。

  • 值在任一时刻有且只有一个所有者。

  • 当所有者(变量)离开作用域,这个值就被丢弃。

let s = "hello";
{                      // s 在这里无效,它尚未声明let s = "hello";   // 从此处起,s 是有效的// 使用 s}                      // 此作用域已结束,s 不再有效
  • 值不能在同一个作用域里面即分配给可变变量又分配给不可变变量。
let mut s = String::from("hello");
let r1 = &a;
let r2 = &mut a;//cannot borrow `s` as mutable because it is also borrowed as immutable
//mutable borrow occurs hererustcClick for full compiler diagnostic
//main.rs(207, 14): immutable borrow occurs here
//main.rs(209, 23): immutable borrow later used here
  • 可变变量不能在同一作用域里面同时赋值给多个可变变量,在同一作用域里面可以赋值给多个不可变变量(但是会有编译警告)
let mut a = String::from("hello, world");
let r1 = &mut a;
let r2 = &mut a;
println!("{},{}", r1, r2);//cannot borrow `a` as mutable more than once at a time
//second mutable borrow occurs hererustcClick for full compiler diagnostic
//main.rs(196, 14): first mutable borrow occurs here
//main.rs(198, 23): first borrow later used here
  • 当一个不可变变量传入一个函数的时候我们是不能在函数里面进行修改的,反之

fn main() {let s = String::from("hello world");let word = change(&s);// s.clear(); // 错误!println!("the first word is: {}", word);
}fn change(some_string: &String) {some_string.push_str(", world");
}//cannot borrow `*some_string` as mutable, as it is behind a `&` reference
//`some_string` is a `&` reference, so the data it refers to cannot be borrowed as mutablerustcClick for full compiler diagnostic
//main.rs(243, 25): consider changing this to be a mutable reference: `mut `
  • 在一个函数里面的变量的引用是不能被返回的,这样会导致垂悬引用。

fn dangle() -> &String { // dangle 返回一个字符串的引用let s = String::from("hello"); // s 是一个新字符串&s // 返回字符串 s 的引用
} // 这里 s 离开作用域并被丢弃。其内存被释放。// 危险!
  • 当一个可以变量传入一个函数但是该的参数是不可变变量,那么后续要对该值进行修改是不被允许的。

fn main()  {
let mut s = String::from("hello world");let word = first_word(&s);s.clear(); // 错误!println!("the first word is: {}", word);
}fn first_word(s: &str) -> &str {let bytes = s.as_bytes();for (i, &item) in bytes.iter().enumerate() {if item == b' ' {return &s[0..i];}}&s[..]
}
//cannot borrow `s` as mutable because it is also borrowed as immutable
//mutable borrow occurs hererustcClick for full compiler diagnostic
//main.rs(201, 27): immutable borrow occurs here
//main.rs(205, 39): immutable borrow later used here

未完

相关文章:

rust 学习--所有权

所有权是rust的核心功能。 Rust 是通过所有权来管理内存回收的 栈(Stack) 栈是后进先出的 栈中存储的数据在编译时是固定内存大小的数据 数据移除栈叫出栈,数据存入栈叫入栈 入栈要比在堆上分配内存块,入栈时分配器无需为存储…...

关于Git 的基本概念和使用方式

Git是一个分布式版本控制系统,用于跟踪和管理代码的改动。它具有以下基本概念和使用方式: 1. 仓库(Repository):Git使用仓库来存储代码和相关的历史记录。仓库可以是本地的,也可以是远程的。本地仓库保存在…...

《计算机网络微课堂》1-6 计算机体系结构

常见的计算机网络体系结构 从本节课开始,我们要用 4 次课的时间来介绍有关计算机网络体系结构的知识,具体包含以下内容: 一,常见的计算机网络体系结构二,计算机网络体系结构分层的必要性三,计算机网络体系…...

大模型的灵魂解读:Anthropic AI的Claude3 Sonnet可解释性研究

大模型技术论文不断,每个月总会新增上千篇。本专栏精选论文重点解读,主题还是围绕着行业实践和工程量产。若在某个环节出现卡点,可以回到大模型必备腔调重新阅读。而最新科技(Mamba,xLSTM,KAN)则提供了大模型领域最新技…...

大模型框架:vLLM

目录 一、vLLM 介绍 二、安装 vLLM 2.1 使用 GPU 进行安装 2.2 使用CPU进行安装 2.3 相关配置 三、使用 vLLM 3.1 离线推理 3.2 适配OpenAI-API的API服务 一、vLLM 介绍 vLLM是伯克利大学LMSYS组织开源的大语言模型高速推理框架。它利用了全新的注意力算法「PagedAtten…...

SQL 使用心得【持续更新】

COUNT(字段) 不会统计 NULL 值,但是COUNT(*)会只要有子查询,就需要给子查询定义别名!where 后面的条件表达式中不能存在聚合函数,但是 Having 可以聚合函数基本上都是需要配合 group…...

基于Spring Boot的高校图书馆管理系统

项目和论文都有企鹅号2583550535 基于Spring Boot的图书馆管理系统||图书管理系统_哔哩哔哩_bilibili 第1章 绪论... 1 1.1 研究背景和意义... 1 1.2 国内外研究现状... 1 第2章 相关技术概述... 2 2.1 后端开发技术... 2 2.1.1 SpringBoot 2 2.1.2 MySQL.. 2 2.1.3 My…...

python(4) : pip安装使用国内源

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests...

让写书人勇敢穿越纸海的迷雾

坚守纸海:让写书人勇敢穿越纸海的迷雾 你作为一位写书人,在创作过程中你需要坚守初心是非常重要的。在创作的过程中,你会遇到各种挑战和困难,你要勇敢面对迷雾中的挑战,并通过不懈的努力和决心,成功地穿越…...

ROS2学习——节点话题通信(2)

目录 一、ROS2节点 1.概念 2.实例 (1)ros2 run (2)ros2 node list (3)remapping重映射 (4)ros2 node info 二、话题 (1) ros2 topic list &#xf…...

【Spring Boot】深度复盘在开发搜索引擎项目中重难点的整理,以及遇到的困难和总结

💓 博客主页:从零开始的-CodeNinja之路 ⏩ 收录文章:【Spring Boot】深度复盘在开发搜索引擎项目中重难点的整理,以及遇到的困难和总结 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 什么是搜索引…...

配置docker阿里云镜像地址

一、安装docker的步骤: 1.yum install -y yum-utils 2.yum-config-manager --add-repo http://mirrors.aliyun.com/docker- ce/linux/centos/docker-ce.repo --配置阿里云仓库3.yum makecache fast4.yum install docker-ce -y5.docker version …...

ICML 2024 Mamba 论文总结

2024ICML(International Conference on Machine Learning,国际机器学习会议)在2024年7月21日-27日在奥地利维也纳举行 🌟【紧跟前沿】“时空探索之旅”与你一起探索时空奥秘!🚀 欢迎大家关注时空探索之旅 …...

Sass详解

Sass简介 Sass(Syntactically Awesome Stylesheets)是一种CSS预处理器,它在CSS的语法基础上添加了一些功能和语法糖,提供了更强大和灵活的样式表语言。 Sass可以通过定义变量、嵌套规则、混合、继承等功能,帮助开发者…...

如何实现一个高效的排序算法?

要实现一个高效的排序算法,可以考虑以下几个方面: 1.选择合适的排序算法:根据数据规模和特点选择合适的排序算法。例如,对于小规模的数据可以选择插入排序或选择排序,而对于大规模数据可以选择归并排序或快速排序。 …...

Linux--10---安装JDK、MySQL

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 安装JDK[Linux命令--03----JDK .Nginx. 数据库](https://blog.csdn.net/weixin_48052161/article/details/108997148) 第一步 查询系统中自带的JDK第二步 卸载系统中…...

【大数据】MapReduce JAVA API编程实践及适用场景介绍

目录 1.前言 2.mapreduce编程示例 3.MapReduce适用场景 1.前言 本文是作者大数据系列专栏的其中一篇,前文我们依次聊了大数据的概论、分布式文件系统、分布式数据库、以及计算引擎mapreduce核心概念以及工作原理。 书接上文,本文将会继续聊一下mapr…...

图像分类和文本分类(传统机器学习和深度学习)

1. 传统机器学习—决策树 1.1 图像分类代码 from sklearn import tree from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split# 加载数据集 iris load_iris() X, y iris.data, iris.target# 划分数据集 X_train, X_test, y_train,…...

基于SpringBoot和Hutool工具包实现的验证码案例

目录 验证码案例 1. 需求 2. 准备工作 3. 约定前后端交互接口 需求分析 接口定义 4. Hutool 工具介绍 5. 实现验证码 后端代码 前端代码 6. 运行测试 验证码案例 随着安全性的要求越来越高,目前项目中很多都会使用验证码,只要涉及到登录&…...

python-找出四位数中的玫瑰花数

【问题描述】玫瑰花数指一个n位数(n>4),其每位上的数字的n次幂之和等于本身。 请求出所有四位数中的玫瑰花数 【输入形式】 【输出形式】 【样例输入】 【样例输出】1634 8208 9474 【样例说明】 【评分标准】 完整代码如下: for n in ra…...

终极Mailtrain故障排除指南:10个常见问题与快速解决方案

终极Mailtrain故障排除指南:10个常见问题与快速解决方案 【免费下载链接】mailtrain Self hosted newsletter app 项目地址: https://gitcode.com/gh_mirrors/ma/mailtrain Mailtrain作为一款自托管的 newsletter 应用,为用户提供了强大的邮件营销…...

ParrelSync跨平台终极指南:Windows、macOS和Linux完整配置教程

ParrelSync跨平台终极指南:Windows、macOS和Linux完整配置教程 【免费下载链接】ParrelSync (Unity3D) Test multiplayer without building 项目地址: https://gitcode.com/gh_mirrors/pa/ParrelSync ParrelSync是一款专为Unity3D开发者设计的高效工具&#…...

CCF-CSP 39-2 水印检查(watermark)【C++】

题目 https://sim.csp.thusaac.com/contest/39/problem/1https://sim.csp.thusaac.com/contest/39/problem/1 思路参考: 80分 暴力求解,遍历所有可能的k,检验是否满足条件,可得80分 时间复杂度:O(L*n^2)&#xff0…...

YOLOE官版镜像案例分享:文本提示检测自定义物体实战

YOLOE官版镜像案例分享:文本提示检测自定义物体实战 1. 引言:开放词汇表检测的挑战与突破 在传统计算机视觉应用中,目标检测模型往往受限于预定义的类别集合。当需要检测训练数据中未出现的新物体时,开发者不得不重新收集数据、…...

[双重嵌入架构]:实现高精度人脸生成的AI解决方案

[双重嵌入架构]:实现高精度人脸生成的AI解决方案 【免费下载链接】IP-Adapter-FaceID 项目地址: https://ai.gitcode.com/hf_mirrors/h94/IP-Adapter-FaceID 1. 技术原理:双重嵌入架构的创新突破 1.1 并行特征处理机制 IP-Adapter-FaceID Plus…...

gte-base-zh在AIGC内容审核中的应用

gte-base-zh在AIGC内容审核中的应用 最近和几个做AIGC应用的朋友聊天,大家普遍反映一个头疼的问题:内容审核。用户生成的内容五花八门,数量巨大,单靠人工审核,不仅成本高,还容易漏掉一些打擦边球或者变着花…...

SmolVLA部署案例:树莓派5+USB GPU加速器运行SmolVLA轻量版可行性探索

SmolVLA部署案例:树莓派5USB GPU加速器运行SmolVLA轻量版可行性探索 1. 引言 你有没有想过,让一个巴掌大的树莓派也能跑起来一个能“看懂”世界、听懂指令、并控制机器人动作的AI模型?这听起来像是科幻电影里的场景,但今天我们要…...

用Python和MATLAB/Simulink复现车辆二自由度模型:从理论公式到仿真验证(附代码)

从理论到实践:Python与MATLAB/Simulink实现车辆二自由度动力学仿真 在自动驾驶和车辆工程领域,理解车辆动力学模型是开发先进控制算法的基础。二自由度模型作为最简单的车辆动力学模型之一,能够有效描述车辆的侧向和横摆运动特性。本文将带您…...

StructBERT在代码仓库管理中的重复代码检测应用

StructBERT在代码仓库管理中的重复代码检测应用 你有没有遇到过这种情况?在代码审查时,总觉得某段代码似曾相识,但又说不清在哪见过。或者,团队里不同成员为了解决类似问题,各自写了一套逻辑相近但细节不同的代码&…...

C语言起源发展全知道,带你了解编程界元老的辉煌历程

C言语是一种具有通用性的编程言语,在软件开发范畴被广泛运用,如操作系统、嵌入式系统、高性能服务器还有各类应用软件,它因强大功能、简洁语法以及高效性能而闻名,本文会详细介绍C言语的起源、发展进程以及其在当今编程世界里的地…...