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…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
归并排序:分治思想的高效排序
目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法,由约翰冯诺伊曼在1945年提出。其核心思想包括: 分割(Divide):将待排序数组递归地分成两个子…...
路由基础-路由表
本篇将会向读者介绍路由的基本概念。 前言 在一个典型的数据通信网络中,往往存在多个不同的IP网段,数据在不同的IP网段之间交互是需要借助三层设备的,这些设备具备路由能力,能够实现数据的跨网段转发。 路由是数据通信网络中最基…...
如何把工业通信协议转换成http websocket
1.现状 工业通信协议多数工作在边缘设备上,比如:PLC、IOT盒子等。上层业务系统需要根据不同的工业协议做对应开发,当设备上用的是modbus从站时,采集设备数据需要开发modbus主站;当设备上用的是西门子PN协议时…...
shell脚本质数判断
shell脚本质数判断 shell输入一个正整数,判断是否为质数(素数)shell求1-100内的质数shell求给定数组输出其中的质数 shell输入一个正整数,判断是否为质数(素数) 思路: 1:1 2:1 2 3:1 2 3 4:1 2 3 4 5:1 2 3 4 5-------> 3:2 4:2 3 5:2 3…...
