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:内存不安全 内存安全问题,例如空指针解引用 关键字unsafe来切换到不安全模式,并在被标记后的代码块中使用不安全代码 使用unsafe告诉编译器后面代码安全性自行负责 因为电脑硬件安全问题,必须编写可能不安全的代码 可以将…...
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(You Only Look Once)模型构建一个鸟类识别系统,包括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做解码,然后发送给B端,B端怎么解码? B端视频采用…...
面试场景题系列--(1)如果系统的 QPS 突然提升 10 倍该怎么设计?--xunznux
1. 如果系统的 QPS 突然提升 10 倍该怎么设计? 1.1 硬件的扩展微服务的拆分 如果所有的业务包括交易系统、会员信息、库存、商品等等都夹杂在一起,当流量一旦起来之后,单体架构的问题就暴露出来了,机器挂了所有的业务就全部无法…...
【数学建模】——前沿图与网络模型:新时代算法解析与应用
目录 1.图与网络的基本概念 1. 无向图和有向图 2. 简单图、完全图、赋权图 3. 顶点的度 4. 子图与图的连通性 2.图的矩阵表示 1. 关联矩阵 2. 邻接矩阵 3.最短路问题 1.Dijkstra 算法 2.Floyd 算法 4.最小生成树问题 1.Kruskal 算法 2.Prim 算法 5.着色问题 6.…...
视频分帧【截取图片】(YOLO目标检测【生成数据集】)
高效率制作数据集【按这个流程走,速度很顶】 本次制作,1059张图片【马路上流动车辆】 几乎就是全自动了,只要视频拍得好,YOLO辅助制作数据集就效率极高 视频中的图片抽取: 【由于视频内存过大,遇到报错执行…...
Redis7(二)Redis持久化双雄
持久化之RDB RDB的持久化方式是在指定时间间隔,执行数据集的时间点快照。也就是在指定的时间间隔将内存中的数据集快照写入磁盘,也就是Snapshot内存快照,它恢复时再将硬盘快照文件直接读回到内存里面。 RDB保存的是dump.rdb文件。 自动触发…...
发布支持TS的npm包
你现在有这么一个包,已经将他发布在npm上了,周下载量也还比较可观。美中不足的就是,这个包之前使用js写的,现在你想增加TS类型,提升用户使用体验,那么你现在可以做以下几个步骤 1.在你的包的根目录下创建一…...
计算机视觉9 全卷积网络
全卷积网络(Fully Convolutional Network,简称 FCN)在计算机视觉领域具有重要地位。 传统的卷积神经网络(CNN)在最后的输出层通常使用全连接层来进行分类任务。然而,全连接层会丢失空间信息,使得…...
02.C++入门基础(下)
1.函数重载 C支持在同一作用域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者类型不同。这样C函数调用就表现出了多态行为,使用更灵活。C语言是不支持同一作用域中出现同名函数的。 1、参数类型不同 2、参数个数不同…...
【数据结构】探索排序的奥秘
若有不懂地方,可查阅我之前文章哦! 个人主页:小八哥向前冲~_csdn博客 所属专栏:数据结构_专栏 目录 排序的概念 几种排序方法介绍 冒泡排序 选择排序 插入排序 堆排序 向上调整建堆排序 向下调整建堆排序 希尔排序 快速…...
数据结构面试知识点总结3
#来自ウルトラマンティガ(迪迦) 1 线性表 最基本、最简单、最常用的一种数据结构。一个线性表是 n 个具有相同特性的数据元素的有限序列。 特征:数据元素之间是一对一的逻辑关系。 第一个数据元素没有前驱,称为头结点࿱…...
python-爬虫实例(5):将进酒,杯莫停!
目录 前言 将进酒,杯莫停! 一、浇给 二、前摇 1.导入selenium库 2.下载浏览器驱动 三、爬虫四步走 1.UA伪装 2.获取url 3.发送请求 4.获取响应数据进行解析并保存 总结 前言 博主身为一个农批,当然要尝试爬取王者荣耀的东西啦。 将进…...
AGI 之 【Hugging Face】 的【从零训练Transformer模型】之二 [ 从零训练一个模型 ] 的简单整理
AGI 之 【Hugging Face】 的【从零训练Transformer模型】之二 [ 从零训练一个模型 ] 的简单整理 目录 AGI 之 【Hugging Face】 的【从零训练Transformer模型】之二 [ 从零训练一个模型 ] 的简单整理 一、简单介绍 二、Transformer 1、模型架构 2、应用场景 3、Hugging …...
十大排序的稳定性和时间复杂度
十大排序算法的稳定性和时间复杂度是数据结构和算法中的重要内容。 以下是对这些算法的稳定性和时间复杂度的详细分析: 稳定性 稳定性指的是排序算法在排序过程中是否能够保持相等元素的原始相对顺序。根据这个定义,我们可以将排序算法分为稳定排序和…...
【系列教程之】1、点亮一个LED灯
1、点亮一个LED灯 作者将狼才鲸创建日期2024-07-23 CSDN教程目录地址:【目录】8051汇编与C语言系列教程本Gitee仓库原始地址:才鲸嵌入式/8051_c51_单片机从汇编到C_从Boot到应用实践教程 本源码包含C语言和汇编工程,能直接在电脑中通过Keil…...
搜维尔科技:Manus Metagloves使用精确的量子跟踪技术捕捉手部每一个细节动作
Manus Metagloves使用精确的量子跟踪技术捕捉手部每一个细节动作 搜维尔科技: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库 安装库: pip install pyinstaller打包命令标注主入库程序: pyinstaller -F.\程序入口文件.py 出现了一个问题就是我在打包运行之后会出现有一些插件没有被打包。 解决问题: 通过添加--hidden-importcomtypes.strea…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...
热烈祝贺埃文科技正式加入可信数据空间发展联盟
2025年4月29日,在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上,可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞,强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...
小智AI+MCP
什么是小智AI和MCP 如果还不清楚的先看往期文章 手搓小智AI聊天机器人 MCP 深度解析:AI 的USB接口 如何使用小智MCP 1.刷支持mcp的小智固件 2.下载官方MCP的示例代码 Github:https://github.com/78/mcp-calculator 安这个步骤执行 其中MCP_ENDPOI…...
