当前位置: 首页 > 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…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...