Rust: offset祼指针操作
offset是偏移元素个数,不是字节数!
fn main(){let student_a = Student{id:20240001,name:"张三娃".into(),class_id:3,age:14,grade:1};let student_b = Student{id:20240002,name:"李四牛".into(),class_id:3,age:15,grade:1};let student_c = Student{id:20240003,name:"王二狗".into(),class_id:3,age:14,grade:1};let student_d = Student{id:20240004,name:"吴七喜".into(),class_id:3,age:24,grade:1};let students= vec![student_a, student_b, student_c, student_d];let class = Class{students,class_id:3,grade:1};let student_size = std::mem::size_of::<Student>(); // student结构体大小let student_align= std::mem::align_of::<Student>();//student内部对齐println!("student_size:{:?} student_align:{:?}",student_size,student_align);let class_ptr = &class as *const Class;let student_a_ptr = &class.students[0] as *const Student;println!("student_a value :{:?}",unsafe{&*student_a_ptr as &Student});//let student_b_ptr = unsafe{ student_a_ptr.add(1)}; // 也可以用add这种方式// 注意:offset不是偏移字节数,而是偏移元素个数!let student_b_ptr = unsafe{ student_a_ptr.offset(1)}; // offset方式let offset_between_a_and_b = unsafe{student_a_ptr.offset_from(student_b_ptr)};println!("offset_between_a_and_b:{}",offset_between_a_and_b);// -1println!("student_b value name :{:?}",unsafe{&*student_b_ptr as &Student}.name);//let student_c_ptr = unsafe{ student_a_ptr.add(2)};let student_c_ptr = unsafe{ student_a_ptr.offset(2)};let student_d_ptr = unsafe{ student_a_ptr.offset(3)};println!("student_b ref ptr address : {:p} convert raw ptr address : {:?}",&class.students[1],student_b_ptr);println!("student_b ref ptr address : {:p} convert raw ptr address : {:?}",&class.students[2],student_c_ptr);println!("student_b ref ptr address : {:p} convert raw ptr address : {:?}",&class.students[3],student_d_ptr);}
// 某某中学
// 班级
struct Class{students: Vec<Student>,//学生class_id: u32, //3班grade:u32, //高3
}
#[derive(Debug)]
struct Student{id: u32, //学号 2024000001;name: String, // 姓名,name="张三"class_id: u32, //班级,class_id=3,3班age: u32, //年龄grade: i8, //年级,grade=1,高中一年级
}
输出:
student_size:40 student_align:8
student_a value :Student { id: 20240001, name: "张三娃", class_id: 3, age: 14, grade: 1 }
offset_between_a_and_b:-1
student_a value :Student { id: 20240001, name: "张三娃", class_id: 3, age: 14, grade: 1 }
offset_between_a_and_b:-1
offset_between_a_and_b:-1
student_b value name :"李四牛"
student_b ref ptr address : 0x1c2ff7f6f48 convert raw ptr address : 0x1c2ff7f6f48
student_b ref ptr address : 0x1c2ff7f6f70 convert raw ptr address : 0x1c2ff7f6f70
student_b ref ptr address : 0x1c2ff7f6f98 convert raw ptr address : 0x1c2ff7f6f98
其实,你可以通过offset函数源码,可以了解更清楚,在offset内部,会再以bytes的倍数进行check_add。
相关文章:
Rust: offset祼指针操作
offset是偏移元素个数,不是字节数! fn main(){let student_a Student{id:20240001,name:"张三娃".into(),class_id:3,age:14,grade:1};let student_b Student{id:20240002,name:"李四牛".into(),class_id:3,age:15,grade:1};let …...

SD本地部署和云端部署的区别以及优劣
相信有相当多多小伙伴应该是看了一些技术或者设计的博主的教程后开始尝试使用SD的,在大多数的SD教程中,绝大多数都是推荐本地化的部署流程,毕竟本地部署后的SD自由度会显得高一些,大部分的操作也都完全可以实现,只不过…...

4、数据结构与算法解析(C语言版)--栈
栈的数据存储遵循“后进先出的规则”,这在计算机里面是非常有用的,比如word等编辑软件的"撤销"功能,就是使用栈进行实现的。 1、创建项目 main.h #ifndef _MAIN_H #define _MAIN_H#include <stdio.h> #include <stdlib.…...
c# 后台任务自动执行
如果有些任务需要在后台自动执行,且时不时需要添加一个任务,且按照优先级顺序执行,那么可以参考本文的方法。 后台任务类 定义一个后台任务类BackgroundTaskThread,其中Start方法是用来启动任务的,循环查询是否有添加…...

被裁20240927 --- 嵌入式硬件开发 前篇
前篇主要介绍一些相关的概念,用于常识扫盲,后篇开始上干货! 他捧着一只碗吃过百家的饭 1. 处理器芯片1.1 处理器芯片制造商一、 英特尔(Intel)二、 三星(SAMSUNG)三、 高通(Qualcomm…...

重温设计模式--观察者模式
文章目录 观察者模式(Observer Pattern)概述观察者模式UML图作用:实现对象间的解耦支持一对多的依赖关系易于维护和扩展 观察者模式的结构抽象主题(Subject):具体主题(Concrete Subject…...

vulnhub靶场——Log4j2
第一步:搭建靶场环境 #开启环境 cd vulhub/log4j/CVE-2021-44228 docker-compose up -d 来到网站首页 第二步:搭建一个dnslog平台上获取我们注入的效果 第三步:发现 /solr/admin/cores?action 这里有个参数可以传 我们可以看到留下了访问记录并且前面的参数被执行后给我们回…...

Vue3中使用resolve进行路径别名设置
Vue3中使用resolve进行路径别名设置 使用Vite初始化Vue3项目工程请参考文章:Vite创建Vue3工程并引入ElementPlus(图文详细) 1.使用~路径别名替换根目录,使用路径别名替换src目录 在vite.config.js配置文件下添加如下配置 impo…...

Linux 添加磁盘
1、编辑虚拟机添加磁盘 然后开启虚拟机 选项如下: DOS (MBR) a 切换可引导标志 b 编辑嵌套的 BSD 磁盘标签 c 切换 DOS 兼容标志 通用 d 删除一个分区 F 列出未分配的空闲空间 l 列出已知的分区类型 n 添加一个新分区 p 打印分区表 t 更改分区类…...

集成 jacoco 插件,查看单元测试覆盖率
文章目录 前言集成 jacoco 插件,查看单元测试覆盖率1. 添加pom2. 配置完成、执行扫描3. 执行结果4. 单元测试报告 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。 而且听说点赞…...
MySQL purged gtid是如何生成和维护的
目录 1. GTID的基本概念2. GTID的生成3. GTID的清除3.1 手动清除二进制日志3.2 自动清除二进制日志3.3 重置主库 在MySQL中,gtid_purged表示已清除的GTID集合。 gtid_purged的生成和维护过程如下: 1. GTID的基本概念 GTID(Global Transact…...
[创业之路-206]:《华为战略管理法-DSTE实战体系》- 6-关键成功因素法CSF
目录 一、概述 1、定义与起源 2、关键成功因素的定义 3、关键成功因素的来源 4、关键成功因素的确认方法 5、关键成功因素法的步骤 6、关键成功因素法的应用 7、关键成功因素法的优势与局限性 二、 关键成功因素法CSF的应用 1、企业战略管理 2、项目管理 3、绩效管…...
[Unity]【图形渲染】【游戏开发】Shader数学基础4-更多矢量运算
在计算机图形学和着色器编程中,矢量运算是核心的数学工具之一。矢量用于描述空间中的位置、方向、速度等各种物理量,并在图形变换、光照计算、纹理映射等方面起着至关重要的作用。本篇文章将详细讲解矢量和标量之间的乘法与除法、矢量的加法与减法、矢量的模与单位矢量、点积…...

目标检测——基于yolov8和pyqt的螺栓松动检测系统
目录 1.项目克隆和环境配置1.1 我这里使用的是v8.0.6版本1.2 项目代码结构介绍 2.数据集介绍2.1 数据集采集2.2采集结果介绍 3.模型训练4.pyqt界面设计4.1 界面内容介绍4.2 界面实现 5.操作中的逻辑实现5.1 图片检测5.2 文件夹检测5.3 视频检测和摄像头检测 6. 效果展示 1.项目…...

【Java数据结构】LinkedList
认识LinkedList LinkedList就是一个链表,它也是实现List接口的一个类。LinkedList就是通过next引用将所有的结点链接起来,所以不需要数组。LinkedList也是以泛型的方法实现的,所以使用这个类都需要实例化对象。 链表分为很多种,比…...

图像处理-Ch4-频率域处理
Ch4 频率域处理(Image Enhancement in Frequency Domain) FT :将信号表示成各种频率的正弦信号的线性组合。 频谱: ∣ F ( u , v ) ∣ [ R 2 ( u , v ) I 2 ( u , v ) ] 1 2 |F(u, v)| \left[ R^2(u, v) I^2(u, v) \right]^{\frac{1}{2}} ∣F(u,v)…...

WPS工具栏灰色怎么办
WPS离线不登录,开启工具栏等相关功能 当你在使用WPS的过程中,若因网络问题或其他特殊原因,导致无法登录使用WPS时,可根据以下步骤开启离线兼容模式,开启此模式后,可在未登录的状态下,激活并使用…...

渐开线齿轮和摆线齿轮有什么区别?
摆线齿形与渐开线齿形的区别 虽然在比对这两种齿形,但有一个事情希望大家注意:渐开线齿轮只是摆线齿轮的一个特例。 (1)摆线齿形的压力角在啮合开始时最大,在齿节点减小到零,在啮合结束时再次增大到最大…...

vulnhub靶场-matrix-breakout-2-morpheus攻略(截止至获取shell)
扫描出ip为192.168.121.161 访问该ip,发现只是一个静态页面什么也没有 使用dir dirsearch 御剑都只能扫描到/robots.txt /server-status 两个页面,前者提示我们什么也没有,后面两个没有权限访问 扫描端口,存在81端口 访问&#x…...

应用高次、有理代数式为AI生成亚对称图像
原创:daode1212(daode3056) 本文定义不完全对称的图像叫亚对称图像,因为全对称的太过机械,不符合人工的特点,本人基于二元高次的有理式,生成时引入N个随机数分A,B两个组,再通过指针对画布所有像素高速扫描生…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...

手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...

java 局域网 rtsp 取流 WebSocket 推送到前端显示 低延迟
众所周知 摄像头取流推流显示前端延迟大 传统方法是服务器取摄像头的rtsp流 然后客户端连服务器 中转多了,延迟一定不小。 假设相机没有专网 公网 1相机自带推流 直接推送到云服务器 然后客户端拉去 2相机只有rtsp ,边缘服务器拉流推送到云服务器 …...

开疆智能Ethernet/IP转Modbus网关连接鸣志步进电机驱动器配置案例
在工业自动化控制系统中,常常会遇到不同品牌和通信协议的设备需要协同工作的情况。本案例中,客户现场采用了 罗克韦尔PLC,但需要控制的变频器仅支持 ModbusRTU 协议。为了实现PLC 对变频器的有效控制与监控,引入了开疆智能Etherne…...