如何理解Rust中的对象

先看看下面2段代码,第1段代码正常,第2段却编译失败,为什么呢?

fn main() {let a: u32 = 5;let b = a;println!("a={a}, b={b}");
}正常
fn main() {let a = String::from("Hello");let b = a;println!("a={a}, b={b}");
}编译失败

第2段代码的编译错误信息显示 a 的所有权已经被转移,那第1段代码为什么没有发生转移呢?直接的原因是u32 数据类型支持 Copy trait,而 String 数据类型不支持 Copy trait。

如何实现自定义数据类型支持Copy trait

  1. 如果自定义数据类型的所有成员类型都已经支持 Copy trait,直接在定义中使用继承宏即可。如代码 - 3,这里需要注意一点,支持 Copy 的前提是支持 Clone。
#[derive(Debug, Clone, Copy)]
struct ST {a: i32,b: u16,c: f32,d: [i8; 10]
}
fn main() {let a = ST{a:-32, b:17, c: 3.28, d:[80;10]};let b = a;println!("a={a:?}");println!("b={b:?}");
}
  1. 如果自定义数据类型中有成员不支持 Copy trait,那么这个类型就无法支持 Copy trait。

一旦数据类型支持了 Copy trait,那么赋值语句就会隐式地重新生成一个对象,从而占用更多的内存。同时 Drop trait 和 Copy trait 是互斥的,无法同时支持。

如果强制将对象分配到堆上

多数 Rust 原型类型数据默认是分配在栈上的,比如 i32, u16 等等。那么如何才能将它们分配到堆上,从而使它跨越函数甚至线程来访问呢?

  1. 使用静态变量。这没什么好说的,但在很多情况下,不是好习惯。
  2. 使用 Box 来强制分配到堆上。

小结

在Rust中,对象是内存中的一个数据(大小不定)。内存对象大致分有2种情况:一种是对象全部在栈内存中,比如原生类型;另一种是对象实际上分成2个部分:实际数据内容位于堆内存上,而栈内存上有一个胖指针(指向起始位置的指针和数据长度)指向堆上的实际内容,代码通过这个胖指针访问实际数据,比如 String 类型。

对于第一种类型,赋值操作执行按位复制不会存在什么问题。对于第二种类型,如果赋值操作仅仅对栈部分执行按位复制就会造成多个胖指针指向同一个堆内容,在没有进入引用计数的情况下就容易造成悬垂指针的情况下,所以,对于第二种类型,Rust 的赋值操作执行的是移动语义,即转移所有权。

我们知道栈对象在函数返回时就会自动释放,但堆对象需要某种方式进行额外的释放操作,否则就存在内存泄漏问题。在Rust中,第二种类型对象,都默认实现了 Drop trait,进而在语音层面实现了安全释放的功能,即栈部分释放前,会调用 Drop::drop 来析构整个对象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/704913.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python中如何引用正则表达式?

无极低码 :https://wheart.cn 引言 正则表达式(Regular expressions,也叫 REs、 regexs 或 regex patterns),本质上是嵌入 Python 内部并通过 re 模块提供的一种微小的、高度专业化的编程语言。使用这种小语言&#…

事件循环解析

浏览器的进程模型 何为进程? 程序运行需要有它自己专属的内存空间,可以把这块内存空间简单的理解为进程 每个应用至少有一个进程,进程之间相互独立,即使要通信,也需要双方同意。 何为线程? 有了进程后&…

8.网络游戏逆向分析与漏洞攻防-游戏网络架构逆向分析-游戏底层功能对接类GameProc的实现

内容参考于:易道云信息技术研究院VIP课 上一个内容:通过逆向分析确定游戏明文接收数据过程 码云地址(master 分支):https://gitee.com/dye_your_fingers/titan 码云版本号:bcf7559184863febdcad819e48aa…

python number类型中的各种数学函数

python中的数学函数 函数返回值 ( 描述 )abs(x)返回数字的绝对值&#xff0c;如abs(-10) 返回 10ceil(x)返回数字的上入整数&#xff0c;如math.ceil(4.1) 返回 5cmp(x, y)如果 x < y 返回 -1, 如果 x y 返回 0, 如果 x > y 返回 1。Python 3 已废弃&#xff0c;使用 (…

QT信号槽实现分析

1.宏定义 qt中引入了MOC来反射&#xff0c;编译阶段变成 MOC–>预处理–>编译–>汇编–>链接 1-1、Q_OBJECT 这个宏定义了一系列代码&#xff0c;包括元对象和处理的函数 #define Q_OBJECT \public: \QT_WARNING_PUSH \Q_OBJECT_NO_OVERRIDE_WARNING \static c…

如何学习Arduino单片机

&#xff08;本文为简单介绍&#xff0c;内容源于网络&#xff09; 学习Arduino相关的网址和开源社区&#xff1a; Arduino官方文档: Arduino - HomeArduino Forum: Arduino ForumArduino Playground: Arduino Playground - HomePageGitHub: GitHub: Let’s build from here …

AE电源Apex Generator 系列5708009-C 使用说明 文件内容可以看目录,包含使用,调试,安装等内容都有160页

AE电源Apex Generator 系列5708009-C 使用说明 文件内容可以看目录&#xff0c;包含使用&#xff0c;调试&#xff0c;安装等内容都有160页

2.26 Qt day4+5 纯净窗口移动+绘画事件+Qt实现TCP连接服务+Qt实现连接数据库

思维导图 Qt实现TCP连接 服务器端&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTcpServer>//服务器端类 #include<QTcpSocket>//客户端类 #include<QMessageBox>//消息对话框类 #include<QList>//链…

exec函数族 和 线程 学习

一.exec函数族 extern char **environ; int execl(const char *path, const char *arg, ... &#xff08;后面跟的参数&#xff09; /* (char *) NULL */); eg&#xff1a; int main(void) //execl用法 {printf("");exec…

nginx管理命令

nginx管理命令 ngnix作用是多个进程处理网络请求。一部分是管理命令&#xff0c;一部分是配置文件。 nginx管理命令 两种管理方式nginx管理和systemctl管理&#xff0c;注意使用哪种方式开始就用哪种方式结束。 1. nginx管理方式 nginx -t : 检测nginx.conf配置文件的语法 …

【项目管理需求分析】环境决定了你能看到什么

文章目录 前言基层的痛1.业务提不出需求2.建议不可取 总结 前言 近期工作中有所感悟&#xff0c;乘着春节的尾巴不是很忙&#xff0c;就记录下来。 随着公司的不断扩大&#xff0c;总公司、省公司、市公司、县公司&#xff5e;&#xff0c;纵向越来越深&#xff0c;科技专业人…

react脚手架

1.react概述 1.1 什么是react React是一个用于构建用户界面的JS库。 用户界面&#xff1a;HTML页面&#xff08;前端&#xff09; React主要用来写HTML界面&#xff0c;或构建Web应用 如果从MVC的角度来看&#xff0c;React仅仅是视图层&#xff08;V&#xff09;,也就是只负…

亿道丨三防平板丨手持平板丨加固平板丨助力地震救援

自土耳其发生7.8级大地震以来&#xff0c;一直都牵动着世人的心。2023年2月10日&#xff0c;据法新社最新消息&#xff0c;强震已造成土耳其和叙利亚两国超2万人遇难。报道称&#xff0c;相关官员和医护人员表示&#xff0c;地震造成土耳其17674人死亡&#xff0c;叙利亚则有33…

Nginx+Tomcat实现动静分离

文章目录 一.动静分离的原理及架构1.1 动静分离是什么&#xff1f;1.2 动静分离的原理1.3 动静分离的架构组成 二.NginxTomcat实现动静分离2.1实验环境2.2所需软件环境2.3nginx服务的实现2.4配置动静分离 一.动静分离的原理及架构 1.1 动静分离是什么&#xff1f; 动静分离(S…

Nginx的核心配置指令及调优

目录 Nginx 核心配置指令 一、Nginx配置文件详解 1、配置文件目录 2、配置文件结构 二、调优 1、在全局域进行的调优 1.1线程池指令 1.2 工作进程数指令 1.3工作进程优先级指令 1.4 工作进程 CPU 绑定指令 1.5 调试可打开的文件个数 1.6 调试文件大小指令 1.7 只运…

FL Studio Fruity Edition2024中文入门版Win/Mac

FL Studio Fruity Edition2024是一款功能强大的音乐制作软件&#xff0c;适合初学者和音乐爱好者使用。它提供了丰富的音乐制作工具&#xff0c;包括音频录制、编辑、混音以及MIDI制作等功能&#xff0c;帮助用户轻松创作出动人的音乐作品。 FL Studio 21.2.3 Win-安装包下载如…

《数据治理简易速速上手小册》第1章 数据治理概述(2024 最新版)

文章目录 1.1 数据治理的定义与重要性1.1.1 基础知识1.1.2 重点案例&#xff1a;客户数据分析1.1.3 拓展案例 1&#xff1a;库存管理系统1.1.4 拓展案例 2&#xff1a;合规性数据报告 1.2 数据治理的发展历程1.2.1 基础知识1.2.2 重点案例&#xff1a;电商平台的用户数据管理1.…

苍穹外卖 -- day10- Spring Task- 订单状态定时处理- WebSocket- 来单提醒- 客户催单

苍穹外卖-day10 功能实现&#xff1a;订单状态定时处理、来单提醒和客户催单 订单状态定时处理&#xff1a; 来单提醒&#xff1a; 客户催单&#xff1a; 1. Spring Task 1.1 介绍 Spring Task 是Spring框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代…

稀疏表示分类(Sparse Representation for Classification,SRC)

稀疏表示分类&#xff08;Sparse Representation for Classification&#xff0c;简称SRC&#xff09;是一项在模式识别和信号处理中应用广泛的技术。它基于这样一个概念&#xff1a;一个信号&#xff08;比如图像、语音等&#xff09;可以用一个较大的字典中的一些基向量稀疏地…