陈天老师的Rust培训(2)学习笔记

news2024/10/3 10:34:42

 

所有权:

  • Rust中的每一个值都有一个被称为其 所有者(owner)的变量
  • 值在任一时刻有且只有一个所有者。
  • 当所有者(变量)离开作用域的时候,这个值将被丢弃。

Copy的类型:

  • 所有整数类型,比如u32。
  • 布尔类型
  • 所有浮点数类型,比如f64
  • 字符类型,char
  • 元组,当且仅当其包含的类型也都是Copy的时候。比如(u32,u32)是Copy的,但是(u32,String)就不是。

当我们变量从一个地方传递到另外一个地方,如果你实现了Copy Trait,就会按bit去拷贝,把这个变量的值,拷贝到新的scope下面。

如果一个变量的类型没有实现Copy Trait,默认就是move,它会把变量的值从一个地move到另外一个地方,

 

 

 

rust大部分数据结构都是Sized的,如果说一个data type的大小在编译器可以确定的话,它的类型就是Sized。反之就是DST。

因为在编译器可以确定数据结构的大小,就可以放在栈上。我在一个函数里面声明一个变量,变量它的数据结构的类型是Sized,那么它就可以放在栈上,反之的话,它不是Sized,是DST的话一般来说只能放在堆上,当然有一些例外,因为DST就意味着编译期的时候,我的大小是不确定的,所以不确定的东西,编译器是没办法把它放在这个栈上的,因为当编译器为函数分配一个新的栈的时候,它需要计算里面用到的局部变量的大小,然后把栈帧指好,这样函数可以正常运行。

但是有些方法可以让DST也放在栈上。比如上图的stack_dst:GitHub - thepowersgang/stack_dst-rs: Stack-allocated DSTs for rust (fixed capacity)

trait object,因为生成一个Vtable,Vtable包含了很多信息,Vtable大小是根据不同的trait,是展示不一样的。

上面Q2:

如果说我们知道这个DST它的最大Sized的话,我们依旧可以给它分配一个它不可能超过的一个大小,比如说我知道这个DST,它的SIZE虽然是变动的,但是它最大不超过64个字节,那么我如果在栈上分配64个字节的话,就能满足这个DST的处理。

 

 

tonic:https://github.com/hyperium/tonic/blob/master/tests/integration_tests/tests/connection.rs

snow:snow/params.rs at master · mcginty/snow · GitHub

cellar:cellar/lib.rs at master · tyrchen/cellar · GitHub

 

Leaf:比如说一个TOKIO 下面创建的TCPStream ,它是一个future,它是一个leaf future。就是这个future,它依赖于外部事件,比如说,操作系统来告诉它什么时候数据有,future会被wake up,进一步的去被处理。

Non-Leaf:它的运转有赖于leaf future的不断poll,得到执行,继续往下走,从而trigger non-leaf future往下执行。

 

讲到future ,就不得不讲pin。rust的future从0.1到0.3它经历了很长时间的变迁,甚至async await在rust unstable里面也存在了很长时间,一直没有稳定,很大一个原因就是但是没有找到妥善的方法来处理一些可能存在的corner case(边界情况),而这个corner case 就是自我引用结构(如上左图)

交换后,因为b变量只是单纯的bit by bit的拷贝,这个指针只是作为一个数据拷过来,所以它还是0x1002,而0x1002指向的是原来a的位置,而原来a的位置已经被swap之后到了右边了。

所以这样就形成了一个环,这个对于rust来讲是一个很棘手的问题,可能将会导致内存泄露,逻辑错误等等,引发一系列的不安全问题,这是rust核心开发团队,很长时间没有找到一个方法来处理这种问题。后来找到的方法,还是跟send sync比较类似,但有这种自引用的结构的时候,我不允许你做这种swap操作,memory move 来move去的操作。那怎么做呢?比较形象的就是用个钉子,把数据结构钉在这,不让你去做move,怎么做到这一点呢?参考send sync,原理类似,首先绝大部分数据结构,都是会自动实现unpin的,如果带了unpin的话,pin就不起任何作用,也就是说它不能把数据结构钉死在这个位置,而是允许这个指针移动。

但是如果一个数据结构没有实现unpin的话,Pin就没办法去拿到这个P的可变引用,Pin

这个P是一个泛型,P要求在做DerefMut的时候,它的target必须是Unpin,所以一旦一个数据结构本身没有实现Unpin,就意味着它的pointer(因为这个pointer是做这个derefmut嘛),对这个pointer做一个mutable reference的话,那它这个mutable reference就不满足P:DerefMut这个前提,编译器就不会让它通过。

pin_project:https://github.com/taiki-e/pin-project

 

https://docs.rs/tokio/1.7.1/tokio/io/trait.AsyncRead.html

https://docs.rs/tokio/1.7.1/tokio/io/trait.AsyncWrite.html

 

Stream in futures::prelude::stream - Rust

Sink in futures::prelude - Rust

以上是培训(1)拾遗

 

 

 

 dashmap和hashmap的区别,hashmap如果要做并发,需要自己加mutex,dashmap,内部已经帮我们做好这些了。

 

tokio_util::codec - Rust

https://github.com/spacejam/sled

 

 

 

 

 

 

 

 

 

 

 

https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md

Are we web yet? Yes, and it's freaking fast!

https://github.com/hyperium/tonic

https://github.com/mcginty/snow

Rust 的 Pin 与 Unpin — Folyd

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

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

相关文章

本地springboot jar 部署到云服务器linux [安装jdk 安装msyql]

A). 安装jdk 参考博客CentOS 8 安装 JAVA 三种方式(yum / rpm / tar.gz) [rootiZt4ned91xzjstx1s6ftjvZ local]# rpm -qa |grep java [rootiZt4ned91xzjstx1s6ftjvZ local]# rpm -qa |grep jdk [rootiZt4ned91xzjstx1s6ftjvZ local]# rpm -qa |grep jre [rootiZt4ned91xzjstx…

bug:解决java.security.InvalidKeyException: Illegal key size or default parameters

bug:解决java.security.InvalidKeyException: Illegal key size or default parameters 1 复现 今天对接外链需要使用AES加密的时候,对方使用的是AES:AES/ECB/PKCS7Padding,但是在加密过程中,发现报错 报错信息:java.…

Spark Shell 的使用

Spark Shell 的使用 Spark shell 作为一个强大的交互式数据分析工具,提供了一个简单的方式学习 API。它可以使用 Scala(在Java 虚拟机上运行现有的Java库的一个很好方式)或 Python。 Spark Shell 命令 启动 Spark Shell 的时候我们可以指定…

JavaIO

CPU指令与内核态、用户态 在操作系统中,CPU负责执行指令,这些指令有些来自应用程序,有些是来自底层系统。 有些指令是非常危险的,如清除内存,网络连接等等,如果错误调用的话有可能导致系统崩溃。 因而CPU将指令分为特…

Excel表格的打开密码如何设置和取消?

给Excel表格设置“打开密码”是保护表格的其中一种方法,这样只有输入正确的密码才能打开表格。 那Excel表格的打开密码如何设置和取消呢? 首先,打开Excel表格,点击菜单栏的【文件】选项,然后依次选择【信息】-【保护…

java项目-第175期ssm高校校园点餐系统-java毕业设计

java项目-第175期ssm高校校园点餐系统-java毕业设计 【源码请到下载专栏下载】 今天分享的项目是《ssm高校校园点餐系统》 该项目分为2个角色,管理员、用户和食堂。 用户可以浏览前台,查看菜品,并进行预约和选座; 同时可以跳转到后台查看自己…

基于jsp+mysql+ssm矿场仓储管理系统-计算机毕业设计

项目介绍 本系统采用了BS架构,利用web技术实现了矿场信息的后台管理,针对矿物质的相关信息,销售情况进行管理。是一款后台信息管理系统,具有管理员和员工两个用户权限,系统设计简单,主要是学习资源&#x…

[R语言]正态分布

目录 分布 连续型变量的分布 正态分布 正态分布的推导 正态分布密度曲线 dnorm 正态分布的概率计算 正态分布累积曲线 总体分位数和尾概率 正态分布案例之一 R语言正态分布函数 正态分布相应的概率计算 正态分布的检验 shapiro.test()函数 Kolmogorov-Smirnov连续…

5.3 10篇美食类小红书爆文拆解【玩赚小红书】

案例一:金牌保姆分享12个万能做饭小技巧 ​ 标题: 万能做饭小技巧这个词可以看的出这个方法都是偏向技巧类,对于人人都有做饭的需求来说,也忍不住让人想看看到底是什么内容。“金牌保姆”四个字可谓是将“万能”这2个字完美诠释&…

首次曝光,Alibaba大佬手撸堪称神级的SpringSecurity全彩手册

有人调侃我们说: 程序员不如送外卖。送外卖是搬运食物,自己是搬运代码,都不产出新的东西……透支体力,又消耗健康,可替代性极强,30岁之后就要面临被优化的危险……想跳槽,但是更高的平台难进&a…

2023年你应该了解的五大采购管理趋势

采购的未来看起来非常具有前景。随着新技术的出现,采购专业人员有许多新的机会来简化他们的工作并节省企业的资金。 以下是一些你应该了解的2023年采购领域趋势。 1、自动化 采购的最大趋势之一是各种任务的自动化。这可以是任何事情,从自动化询价&am…

STC15 - C51 - 操作寄存器时, 不要操作不相关的位

文章目录STC15 - C51 - 操作寄存器时, 不要操作不相关的位概述笔记生成.i文件的选项编译工程后, 查看.list文件和.i文件.c文件相关内容.list文件.i文件通过.i文件(预处理文件), 就可以看到最终实现代码有啥区别了不好使的代码好使的代码总结ENDSTC15 - C51 - 操作寄存器时, 不要…

分布式系统(故障、恢复)

文章目录故障模型可靠组播基于基本组播基于 IP 组播协定问题ConsensusByzantine generalsInteractive Consistency一些重要结论分布式恢复后向恢复Checkpointing AlgorithmCoordinated CheckpointingIndependent CheckpointingMessage Logging AlgorithmPessimistic message lo…

[附源码]Node.js计算机毕业设计高校运动会管理系统 Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

95.(leaflet之家)leaflet态势标绘-进攻方向采集(燕尾)

听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYPE html> <html> <

快速传输大文件,怎么通过网络传大文件给对方(1G以上)

在生活和工作中&#xff0c;我们总是要发送一些比较大的文件给别人&#xff0c;或者在自己的设备之间。在互联网日益发达的今天&#xff0c;我们可以用什么方法通过互联网快速传输大文件&#xff0c;发送1G以上的文件&#xff1f; 一、使用QQ传 在电脑上打开QQ&#xff0c;选…

【技术评论】大数据时代,区块链如何解决数据安全和隐私问题

发表时间&#xff1a;2022年6月23日 信息来源&#xff1a;bsvblockchain.org 在这个时代&#xff0c;像GDPR和HIPAA这样的措施为消费者带来了前所未有的数据保护水平&#xff0c;人们理所当然地想知道&#xff0c;由区块链驱动的数据解决方案如何能够符合这些法规的要求。 (全…

PHP代码审计系列(四)

PHP代码审计系列&#xff08;四&#xff09; 本系列将收集多个PHP代码安全审计项目从易到难&#xff0c;并加入个人详细的源码解读。此系列将进行持续更新。 SQL注入or绕过 源码如下 <?php#GOAL: login as admin,then get the flag; error_reporting(0); require db.in…

Java用户线程和守护线程,线程默认Daemon值是false吗?

文章目录用户线程守护线程必须要在start()方法之前设置守护线程线程默认的daemon值总结Java中通常有两种线程&#xff1a; 用户线程和 守护线程&#xff08;也被称为服务线程&#xff09;通过 Thread.setDaemon(false)设置为 用户线程&#xff08;默认为用户线程&#xff09;通…

【鸿蒙应用开发系列】- 应用置灰方案实现讲解

在某些特殊的日子里&#xff0c;有时候需要对应用进行一个置灰显示处理&#xff0c;在Android中&#xff0c;提供了一些很方便的方法&#xff0c;可以对控件或者应用进行灰色的展示 Android应用置灰方式 1、使用灰色主题皮肤&#xff08;这个开发量比较大&#xff09; 2、图…