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

Rust编程-高级特性

unsafe:内存不安全

        内存安全问题,例如空指针解引用

        关键字unsafe来切换到不安全模式,并在被标记后的代码块中使用不安全代码

                使用unsafe告诉编译器后面代码安全性自行负责

                因为电脑硬件安全问题,必须编写可能不安全的代码

可以将不安全代码封装在一个安全的抽象中并提供一套安全的API,防止unsafe代码泄漏到任何调用它的地方,因为使用安全抽象总会是安全的。

        不安全Rust允许你执行4种在安全Rust中不被允许的操作:

                解引用裸指针:

                        裸指针 (raw pointer):裸指针要么是可变的,要么是不可变的,它们分别被写作*const T和*mut T(固定写法)。

                        星号是类型名的一部分而不是解引用操作。

                        裸指针:(使用裸指针的好处是可以规避Rust的引用规则

                                使用as语法创建裸指针,并且创建裸指针不需要unsafe关键字

                                允许忽略借用规则,可以同时拥有指向同一个内存地址的可变和
不可变指针,或者拥有指向同一个地址的多个可变指针。

                                不能保证自己总是指向了有效的内存地址。

                                允许为空

                                没有实现任何自动清理机制

                                使用裸指针的目的:要用途便是与C代码接口进行交互

                调用不安全的函数或方法:

                        不安全函数(unsafe function),在定义前面要标记unsafe

                        单独的unsafe代码块中调用不安全的函数

                        你可以在一个不安全函数中执

行其他不安全操作而无须添加额外的unsafe代码块

                        创建不安全代码的安全抽象:

                                将不安全代码封装在安全函数中是一种十分常见的抽象。

                                代码中如果需要两次可变引用,那么就可以考虑使用裸指针:

                                        as_mut_ptr方法来访问切片包含的裸指针

                                        slice::from_raw_parts_mut函数接收一个裸指针和长度来创建一个切片

                                        ptr.offset()方法也是不安全的

fn split_at_mut(slice:&mut [i32],mid:usize)->(&mut [i32],&mut [i32]){let len = slice.len();let ptr = slice.as_mut_ptr();// 可变指针assert!(mid<=len);unsafe{(slice::from_raw_parts_mut(ptr,mid),slice::from_raw_parts_mut(ptr.offset(mid as isize), len - mid))   }

        使用裸指针关键是可以确认unsafe代码块中的裸指针都会指向有效的切片数据且不会产生任何的数据竞争

                使用extern函数调用外部代码(另一种语言)      

                        extern关键字, 简化创建使用外部函数的接口

                        任何在extern块中声明的函数都是不安全的。

                        

extern "C"{fn abs(iput:i32) -> i32;
}

        声明在另一种语言中定义的函数 。"C"指明了外部函数使用的应用二进制接口 (Application
Binary Interface,ABI):它被用来定义函数在汇编层面的调用方式。我们使用的"C"ABI正是C编程语言的ABI,它也是最常见的ABI格式之。

        可以使用extern来创建一个允许其他语言调用Rust函数的接口。

        

#[no_mangle]
pub extern "C" fn call_from_c() {
println!("Just called a Rust function from C!");
}

 #[no_mangle] 告诉编译器不允许修改函数名

 在“C”ABI后面指定函数名。这段代码可以被C语言使用

        访问或修改可变的静态变量

        如果两个线程同时访问一个可变的全局变量,那么就会造成数据竞争。

        全局变量也被称为静态 (static)变量

        静态变量的名称会约定俗成地被写作SCREAMING_SNAKE_CASE

        要标注变量的类型,例如&'static str,静态变量只能存储拥有'static生命周期的引

        常量和不可变静态变量:静态变量的值在内存中拥有固定的地址,使用它的值
总是会访问到同样的数据;常量则允许在任何被使用到的时候复制其数据。

        访问和修改可变的静态变量是不安全的

        实现不安全trait:

                trait定义的前面加上unsafe关键字,该trait也只能在unsafe代码块中实现

总结:unsafe关键字能够帮助轻松定位问题

tait的关联类型:       

        定义出包含某些类型的trait,而无须在实现前确定它们的具体类型是什么 

        

pub trait Iterator{type Item;fn next(&mut self) -> Option<Self::Item>;
}impl Iterator for Counter {
type Item = u32;
fn next(&mut self) -> Option<Self::Item> {
}

     Item就是trait的关联类型。关联类型和泛型很像

       泛型版本: 

pub trait Iterator<T> {
fn next(&mut self) -> Option<T>;
}

        使用泛型,需要在每次使用的时候指明泛型的具体类型:

泛型也可以指明其他类型,这样Counter就拥有多个不同版本的Iterator实现

impl Iterator<String> for Counter

  在调用next的时候也必须指明具体的泛型类型

   而使用关联类型:

impl Iterator for Counter

    不用每次都指定是哪种关联类型,一次指定关联类型即可。

        默认泛型参数和运算符重载

        <PlaceholderType=ConcreteType>来为泛型指定默认类型。 

        运算符重载自定义运算符(比如+)的具体行为。       

        完全限定语法

        Rust既不会阻止两个trait拥有相同名称的方法,也不会阻止你为同一个类型实现这样的两个trait。但是使用时需要具体指明调用的具体对象。

        调用同名函数:

 let person = Human;Pilot::fly(&person);Wizard::fly(&person);

,然后传入实例的引用,因为函数的第一个参数是self;

那么对于关联函数,第一个参数不是self:

        完全限定访问语法:

                <Dog as Animal>::baby_name()

        超trait(super trait):

                在一个trait中使用另外一个trait的功能

                

trait OutlinePrint: fmt::Display{
}

        表明trait OutlinePrint依赖fmt::Display

        

相关文章:

Rust编程-高级特性

unsafe&#xff1a;内存不安全 内存安全问题&#xff0c;例如空指针解引用 关键字unsafe来切换到不安全模式&#xff0c;并在被标记后的代码块中使用不安全代码 使用unsafe告诉编译器后面代码安全性自行负责 因为电脑硬件安全问题&#xff0c;必须编写可能不安全的代码 可以将…...

JavaRegexImprove练习(1) (2024.7.22)

ImproveExercise1 package RegexImprove20240722; import java.util.Scanner; public class ImproveExercise {public static void main(String[] args) {Scanner sc new Scanner(System.in);System.out.println("请输入一个字符串");String str sc.nextLine();//…...

基于YOLO模型的鸟类识别系统

鸟类识别在生物研究和保护中具有重要意义。本文将详细介绍如何使用YOLO&#xff08;You Only Look Once&#xff09;模型构建一个鸟类识别系统&#xff0c;包括UI界面、YOLOv8/v7/v6/v5代码以及训练数据集。 目录 2. 环境配置 2.1 安装Python和相关库 2.2 安装YOLO模型库 …...

WebRTC通话原理(SDP、STUN、 TURN、 信令服务器)

文章目录 1.媒体协商SDP简介 2.网络协商STUN的工作原理TURN工作原理 3.信令服务器信令服务器的主要功能信令服务器的实现方式 1.媒体协商 比如下面这个例子 A端与B端要想通信 A端视频采用VP8做解码&#xff0c;然后发送给B端&#xff0c;B端怎么解码&#xff1f; B端视频采用…...

面试场景题系列--(1)如果系统的 QPS 突然提升 10 倍该怎么设计?--xunznux

1. 如果系统的 QPS 突然提升 10 倍该怎么设计&#xff1f; 1.1 硬件的扩展微服务的拆分 如果所有的业务包括交易系统、会员信息、库存、商品等等都夹杂在一起&#xff0c;当流量一旦起来之后&#xff0c;单体架构的问题就暴露出来了&#xff0c;机器挂了所有的业务就全部无法…...

【数学建模】——前沿图与网络模型:新时代算法解析与应用

目录 1.图与网络的基本概念 1. 无向图和有向图 2. 简单图、完全图、赋权图 3. 顶点的度 4. 子图与图的连通性 2.图的矩阵表示 1. 关联矩阵 2. 邻接矩阵 3.最短路问题 1.Dijkstra 算法 2.Floyd 算法 4.最小生成树问题 1.Kruskal 算法 2.Prim 算法 5.着色问题 6.…...

视频分帧【截取图片】(YOLO目标检测【生成数据集】)

高效率制作数据集【按这个流程走&#xff0c;速度很顶】 本次制作&#xff0c;1059张图片【马路上流动车辆】 几乎就是全自动了&#xff0c;只要视频拍得好&#xff0c;YOLO辅助制作数据集就效率极高 视频中的图片抽取&#xff1a; 【由于视频内存过大&#xff0c;遇到报错执行…...

Redis7(二)Redis持久化双雄

持久化之RDB RDB的持久化方式是在指定时间间隔&#xff0c;执行数据集的时间点快照。也就是在指定的时间间隔将内存中的数据集快照写入磁盘&#xff0c;也就是Snapshot内存快照&#xff0c;它恢复时再将硬盘快照文件直接读回到内存里面。 RDB保存的是dump.rdb文件。 自动触发…...

发布支持TS的npm包

你现在有这么一个包&#xff0c;已经将他发布在npm上了&#xff0c;周下载量也还比较可观。美中不足的就是&#xff0c;这个包之前使用js写的&#xff0c;现在你想增加TS类型&#xff0c;提升用户使用体验&#xff0c;那么你现在可以做以下几个步骤 1.在你的包的根目录下创建一…...

计算机视觉9 全卷积网络

全卷积网络&#xff08;Fully Convolutional Network&#xff0c;简称 FCN&#xff09;在计算机视觉领域具有重要地位。 传统的卷积神经网络&#xff08;CNN&#xff09;在最后的输出层通常使用全连接层来进行分类任务。然而&#xff0c;全连接层会丢失空间信息&#xff0c;使得…...

02.C++入门基础(下)

1.函数重载 C支持在同一作用域中出现同名函数&#xff0c;但是要求这些同名函数的形参不同&#xff0c;可以是参数个数不同或者类型不同。这样C函数调用就表现出了多态行为&#xff0c;使用更灵活。C语言是不支持同一作用域中出现同名函数的。 1、参数类型不同 2、参数个数不同…...

【数据结构】探索排序的奥秘

若有不懂地方&#xff0c;可查阅我之前文章哦&#xff01; 个人主页&#xff1a;小八哥向前冲~_csdn博客 所属专栏&#xff1a;数据结构_专栏 目录 排序的概念 几种排序方法介绍 冒泡排序 选择排序 插入排序 堆排序 向上调整建堆排序 向下调整建堆排序 希尔排序 快速…...

数据结构面试知识点总结3

#来自ウルトラマンティガ&#xff08;迪迦&#xff09; 1 线性表 最基本、最简单、最常用的一种数据结构。一个线性表是 n 个具有相同特性的数据元素的有限序列。 特征&#xff1a;数据元素之间是一对一的逻辑关系。 第一个数据元素没有前驱&#xff0c;称为头结点&#xff1…...

python-爬虫实例(5):将进酒,杯莫停!

目录 前言 将进酒&#xff0c;杯莫停&#xff01; 一、浇给 二、前摇 1.导入selenium库 2.下载浏览器驱动 三、爬虫四步走 1.UA伪装 2.获取url 3.发送请求 4.获取响应数据进行解析并保存 总结 前言 博主身为一个农批&#xff0c;当然要尝试爬取王者荣耀的东西啦。 将进…...

AGI 之 【Hugging Face】 的【从零训练Transformer模型】之二 [ 从零训练一个模型 ] 的简单整理

AGI 之 【Hugging Face】 的【从零训练Transformer模型】之二 [ 从零训练一个模型 ] 的简单整理 目录 AGI 之 【Hugging Face】 的【从零训练Transformer模型】之二 [ 从零训练一个模型 ] 的简单整理 一、简单介绍 二、Transformer 1、模型架构 2、应用场景 3、Hugging …...

十大排序的稳定性和时间复杂度

十大排序算法的稳定性和时间复杂度是数据结构和算法中的重要内容。 以下是对这些算法的稳定性和时间复杂度的详细分析&#xff1a; 稳定性 稳定性指的是排序算法在排序过程中是否能够保持相等元素的原始相对顺序。根据这个定义&#xff0c;我们可以将排序算法分为稳定排序和…...

【系列教程之】1、点亮一个LED灯

1、点亮一个LED灯 作者将狼才鲸创建日期2024-07-23 CSDN教程目录地址&#xff1a;【目录】8051汇编与C语言系列教程本Gitee仓库原始地址&#xff1a;才鲸嵌入式/8051_c51_单片机从汇编到C_从Boot到应用实践教程 本源码包含C语言和汇编工程&#xff0c;能直接在电脑中通过Keil…...

搜维尔科技:Manus Metagloves使用精确的量子跟踪技术捕捉手部每一个细节动作

Manus Metagloves使用精确的量子跟踪技术捕捉手部每一个细节动作 搜维尔科技&#xff1a;Manus Metagloves使用精确的量子跟踪技术捕捉手部每一个细节动作...

机器学习 | 阿里云安全恶意程序检测

目录 一、数据探索1.1 数据说明1.2 训练集数据探索1.2.1 数据特征类型1.2.2 数据分布1.2.3 缺失值1.2.4 异常值1.2.5 标签分布探索 1.3 测试集探索1.3.1 数据信息1.3.2 缺失值1.3.3 数据分布1.3.4 异常值 1.4 数据集联合分析1.4.1 file_id 分析1.4.2 API 分析 二、特征工程与基…...

python打包exe文件-实现记录

1、使用pyinstaller库 安装库&#xff1a; pip install pyinstaller打包命令标注主入库程序&#xff1a; pyinstaller -F.\程序入口文件.py 出现了一个问题就是我在打包运行之后会出现有一些插件没有被打包。 解决问题&#xff1a; 通过添加--hidden-importcomtypes.strea…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...