【Rust】所有权OwnerShip
什么是所有权
rust使用由编译器检查的一些规则构成的所有权系统来管理内存。且这不会影响程序的运行效率。
所有权规则
- rust中每一个每一个值都有一个owner。
- 在同一时刻,只能有一个owner。
- 当这个owner超过范围,则该值会被丢弃。
String类型
为什么需要String
- 已经有了字符串字面量了,为啥还需要String类型呢?字面量是硬编码在程序里面的,如果我们在编码的时候并不知道字符串是什么,那我们就不能用字符串字面量了。比如字符串来自用户输入,这时候就需要用String类型来存储了。
- 更多字符串基本用法参考【Rust】字符串String类型学习
内存及分配
简单的情况
在String::from的地方,会申请内存;在}之前rust会调用drop方法释放s的内存。
{let s = String::from("hello"); // s is valid from this point forward// do stuff with s
} // this scope is now over, and s is no// longer valid
字符串赋值的情况
- 当将s1赋值给s2的时候,s1就会被废弃,字符串的堆内存就交给s2去管理了。如果赋值后,再使用s1就会出现编译错误。
- rust语言不会自动进行任何的拷贝,所以可以认为自动拷贝都是高性能的。
let s2 = s1这个过程中相当于发生了move的动作,将字符串的所有权从s1移交给s2。
let s1 = String::from("hello");let s2 = s1;

字符串克隆的情况
- 既然直接赋值,会导致所有权转移。那么如何做到赋值时进行拷贝呢?这就需要用到
clone方法。
let s1 = String::from("hello");
let s2 = s1.clone();
println!("s1 = {s1}, s2 = {s2}");
- 因为
clone方法会拷贝堆上的内存,所以其执行的代价是比较高的。
只在栈上的数据:拷贝
let x = 5;
let y = x;
println!("x = {x}, y = {y}");
- 我们发现如果直接把整数类型x赋值给y,并且在使用x。编译并没有报错。
- 这是因为整形是固定大小的类型,存放在栈上。拷贝的代价很低,其深拷贝和浅拷贝并没有特别大的区别。所以我们可以直接拷贝,而不需要move。
所有权和函数
- 按照我们所有权的规则,如下代码就很容易理解。
fn main() {let s = String::from("hello"); // s comes into scopetakes_ownership(s); // s's value moves into the function...// ... and so is no longer valid herelet x = 5; // x comes into scopemakes_copy(x); // x would move into the function,// but i32 is Copy, so it's okay to still// use x afterward} // Here, x goes out of scope, then s. But because s's value was moved, nothing// special happens.fn takes_ownership(some_string: String) { // some_string comes into scopeprintln!("{some_string}");
} // Here, some_string goes out of scope and `drop` is called. The backing// memory is freed.fn makes_copy(some_integer: i32) { // some_integer comes into scopeprintln!("{some_integer}");
} // Here, some_integer goes out of scope. Nothing special happens.
返回值和有效范围
fn main() {let s1 = gives_ownership(); // gives_ownership moves its return// value into s1let s2 = String::from("hello"); // s2 comes into scopelet s3 = takes_and_gives_back(s2); // s2 is moved into// takes_and_gives_back, which also// moves its return value into s3
} // Here, s3 goes out of scope and is dropped. s2 was moved, so nothing// happens. s1 goes out of scope and is dropped.fn gives_ownership() -> String { // gives_ownership will move its// return value into the function// that calls itlet some_string = String::from("yours"); // some_string comes into scopesome_string // some_string is returned and// moves out to the calling// function
}// This function takes a String and returns one
fn takes_and_gives_back(a_string: String) -> String { // a_string comes into// scopea_string // a_string is returned and moves out to the calling function
}
相关文章:
【Rust】所有权OwnerShip
什么是所有权 rust使用由编译器检查的一些规则构成的所有权系统来管理内存。且这不会影响程序的运行效率。 所有权规则 rust中每一个每一个值都有一个owner。在同一时刻,只能有一个owner。当这个owner超过范围,则该值会被丢弃。 String类型 为什么需…...
qt总结--翻金币案例
完成了一个小项目的在qt5.15.2环境下的运行,并使用NSIS editNSIS打包完成.有待改进之处:增加计时功能,随机且能通关功能,过关后选择下一关功能.打包后仅仅有安装包有图标 安装后应用图标并未改变 在qt .pro中有待改进对qt的基本操作和帮助文档有了基本的认识.对C制作小游戏有了…...
最清楚的 BIO、NIO、AIO 详解!
一、什么是 I/O? I/O 描述了计算机系统与外部设备(磁盘)之间通信的过程。 为了保证操作系统的稳定性和安全性,一个进程的地址空间划分为 用户空间(User space) 和 内核空间(Kernel space &…...
八股文学习第二天| HTTP请求报文和响应报文是怎样的,有哪些常见的字段?,HTTP有哪些请求方式?,GET请求和POST请求的区别?
1、HTTP请求报文和响应报文是怎样的,有哪些常见的字段? 答: HTTP报文分为请求报文和响应报文。 (1) 请求报文 请求报文主要由请求行、请求头、空行、请求体构成。 请求行包括如下字段: 方法(…...
C++初阶学习第四弹——类与对象(中)
目录 一. 类的默认成员函数 二.六种默认成员函数 1、构造函数 1.1 构造函数的作用 1.2 特性 1.3 默认构造函数 2、析构函数 2.1 析构函数的作用 2.2 析构函数的用法 3、拷贝构造函数 3.1 拷贝构造函数的作用 3.2 特征 3.3 默认拷贝构造函数 三.总结 类与对象&…...
【计算机网络】期末实验答辩
注意事项: 1)每位同学要在下面做过的实验列表中选取三个实验进行答辩准备,并将自己的姓名,学号以及三个实验序号填入共享文档"1(2)班答辩名单"中。 2)在答辩当日每位同学由老师在表…...
一步步教你学会如何安装VMare虚拟机(流程参考图)
前言:一步步教你安装VMare虚拟机(此版本为17.5。2版本)。 1、安装 2、确认协议 3、选择位置存放 4、选择第二个 5、都不选。 6、都选提供便捷操作 7、点击许可证,将密钥输入(可以在网络寻找自己版本的密钥ÿ…...
WebGoC题解(14) 151.(2017dloi小乙)第5题 巧克力甜度(sweet)
题目描述 妈妈买了n颗甜度不同的巧克力,规定小C只能吃最大甜度之和是S。 例如:有5颗巧克力,s6,每个的甜度分别为: 4 2 3 1 1,那么小C最多可以吃3颗。 请问你能帮小C计算一下最多能吃多少颗巧克力吗? 输入格…...
深入探索PHP框架:Symfony框架全面解析
1. 引言 在现代Web开发领域,PHP作为一种广泛使用的服务器端脚本语言,其框架的选择对于项目的成功至关重要。PHP框架不仅能够提高开发效率,还能确保代码的质量和可维护性。本文将深入探讨Symfony框架,这是一个功能强大且灵活的PHP…...
内卷的利与弊
“内卷”原指一类文化模式达到了某种最终的形态以后,既没有办法稳定下来,也没有办法转变为新的形态,而只能不断地在内部变得更加复杂的现象。经网络流传,很多大学生用其来指代非理性的内部竞争或“被自愿”竞争。现指同行间竞相付…...
用Java手写jvm之实现查找class
写在前面 完成类加载器加载class的三阶段,加载,解析,初始化中的加载😀😀😀 源码 。 jvm想要运行class,是根据类全限定名称来从特定的位置基于类加载器来查找的,分别如下:…...
【React】组件:全面解析现代前端开发的基石
文章目录 一、什么是组件?二、组件的类型三、组件的生命周期四、状态管理五、属性传递六、组合与继承七、最佳实践 在现代前端开发中,React 已成为开发者构建用户界面的首选框架之一。React 的强大之处在于其组件化设计,允许开发者将 UI 拆分…...
java学习--包装类
包装类 Boolean的关系图 Character关系图 其他关系图 包装类和基本数据转换 Debug进入之后可以看到底层代码如下 例题: 三元运算符是一个整体返回的数的类型看其中所含类型最高的那个是谁就会转成哪个 想要掌握这个这个知识,就要多看源码,直接…...
Python Django功能强大的扩展库之channels使用详解
概要 随着实时 web 应用程序的兴起,传统的同步 web 框架已经无法满足高并发和实时通信的需求。Django Channels 是 Django 的一个扩展,旨在将 Django 从一个同步 HTTP 框架转变为一个支持 WebSockets、HTTP2 和其他协议的异步框架。它不仅能够处理传统的 HTTP 请求,还可以处…...
推荐3款将相片变为动漫风格的免费AI工具推荐
toonme ToonMe是一款功能强大的在线和移动端应用,专门用于将照片转换成卡通风格图像。该工具利用先进的AI技术,能够快速识别照片中的面部特征,并进行智能处理,生成高清晰度的卡通肖像。 功能特点 ToonMe通过其内置的人工智能算法…...
【职业学习】高效工作法
文章目录 01 时间拳击02 非同步沟通03 批量处理04. 80/20法则05. 一次只做一件事 01 时间拳击 时间拳击(Time Boxing)核心是给每项任务创造一个时间限制,然后在固定的时间段内专注地完成这个任务。 不同于传统的待办事项清单:8点…...
【iOS】Tagged Pointer
目录 前言什么是Tagged Pointer?引入Tagged Pointer技术之前引入Tagged Pointer之后总结 Tagged Pointer原理(TagData分析)关闭数据混淆MacOS分析NSNumberNSString iOS分析 判断Tagged PointerTagged Pointer应用Tagged Pointer 注意点 Tagge…...
Mysql explain 优化解析
explain 解释 select_type 效率对比 MySQL 中 EXPLAIN 语句的 select_type 列描述了查询的类型,不同的 select_type 类型在效率上会有所差异。下面我们来比较一下各种 select_type 的效率: SIMPLE: 这是最简单的查询类型,表示查询不包含子查询或 UNION 操作。 这种查询通常是…...
wget下载github文件得到html文件
从github/gitee下载源文件,本来是22M下载下来只有11k 原因: Github会提供html页面,包括指定的文件、上下文与相关操作。通过wget或者curl下载时,会下载该页面 解决方式: github点击Code一栏的raw按钮,获得源…...
【es】elasticsearch 自定义排序-按关键字位置排序
一 背景 要求es查询的结果按关键字位置排序,位置越靠前优先级越高。 es版本7.14.0,项目是thrift,也可以平替springboot,使用easyes连接es。 二 easyes使用 配easyes按官方文档就差不多了 排序 | Easy-Es 主要的一个问题是easy…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门  bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
