rust学习笔记一
sean 编辑于2022-05-18 10:56Rust
Stack 栈,后进先出(LIFO)。
- 栈的数据必须占用已知的大小,而且大小固定的内存空间。
- 写入栈数据比在堆上分配内存要快。因为如栈时操作系统无需分配新的空间,只需要将数据放入栈中即可。而在堆上分配内存,需要操作系统先寻找一块大小能够装下数据的内存空间(操作系统分配大量内存空间需要消耗时间),然后,记录内存地址,然后再写入。
- 读取速度比在堆的读取速度快。现代cpu,栈数据可以存放在高速缓存(比内存速度快10倍以上)中,而堆数据只能存放在内存中,访问堆数据会慢于栈,访问堆数据需要先访问栈,获取到堆的内存地址(增加了寻址的时间),寻址让后再访问内存,速度必然会慢。
Heap 堆,当数据大小未知或者可能变化的数据,存在堆上。
- 需要向系统申请堆的内存空间,返回堆的指针。然后,通过栈中的指针来获取堆的内存地址,然后访问堆中数据。(增加了寻址的时间)
- 写入速度比入栈要慢。(操作系统分配空间耗时,写入内存耗时)
- 读取速度比栈慢。
- 堆上的数据缺乏组织,因此跟踪这些数据何时分配和释放是非常重要的,否则堆上的数据将产生内存泄漏 —— 这些数据将永远无法被回收。
所有权原则:
- 每一个值都被一个变量所拥有,该变量被称为该值的所有者。
- 一个值同时只能被一个变量所拥有,或者说一个值只能拥有一个所有者。
- 当所有者(变量)离开作用域(scope)范围时,这个值将被丢弃(drop)。
用所有权来管理Heap数据:
- 用所有权来跟踪代码的哪些部分在使用heap的数据。
- 最小化heap的重复数据
- 清理heap未使用的数据
拷贝
- rust不会自动创建数据的深拷贝(clone)
- 深浅copy是相对于堆中数据而言,在栈中数据的copy就是值的直接copy类似clone的效果。
- shallow copy 浅拷贝(copy)
- deep copy 深拷贝(clone)
在栈中存储的(不需要分配内存或某种其他形式类型可以copy),任何基本类型组合可以copy,比如:
- 所有整数类型, 比如 u32
- 布尔类型, bool, 它的值是true 和 flase
- 所有浮点类型
- 字符类型 char
- 元族,当且仅当其包含的类型也是都是copy类型的时候。eg: (i32, i32)是copy, 但(i32, String)不可以copy。
- 不可变引用 &T, ,需要注意:可变引用 & mut T是不可以copy的。
引用
& 符号即是引用,它们允许你使用值,但是不获取所有权。
规则:
- 同一时刻,你只能拥有要么一个可变引用, 要么任意多个不可变引用(也就是说,在作用域(scope)内,可变引用不可以同时出现两个,一个变量不可以同时有可变和不可变引用,但可以有多个不可变引用。)
- 引用必须一直有效才行。(防止出现 悬垂引用(Dangling References:指向的内存可能不存在任何值或已被其它变量重新使用。)
字符串字面值是不可变的引用。
切片:
- 是对字符串或集合的部分引用
- 字符串字面量是切片类型(&str),它指向了程序的可执行文件中的某个位置,&str指向的地址内容是不可变的,所以&str是一个不可变的引用。
字符串:
字符串是由字符组成的连续集合,Rust 中的字符是 Unicode 类型,因此每个字符占据 4 个字节内存空间,但是在字符串中不一样,字符串是 UTF-8 编码,也就是字符串中的字符所占的字节数是变化的(1 - 4),这样有助于大幅降低字符串所占用的内存空间。
字符串类型:
Rust 在语言级别,只有一种字符串类型: str,它通常是以引用类型出现 &str。但是在标准库里,还有多种不同用途的字符串类型,其中使用最广的即是 String 类型。
str 类型是硬编码进可执行文件,也无法被修改,但是 String 则是一个可增长、可改变且具有所有权的 UTF-8 编码字符串,当 Rust 用户提到字符串时,往往指的就是 String 类型和 &str 字符串切片类型,这两个类型都是 UTF-8 编码。
String 可变,而字符串字面值 str 不可变。
字符串字面值str,在编译时就知道其内容,最终字面值文本被直接硬编码进可执行文件中,这使得字符串字面值快速且高效,这主要得益于字符串字面值的不可变性。
String 类型,为了支持一个可变、可增长的文本片段,需要在堆上分配一块在编译时未知大小的内存来存放内容,这些都是在程序运行时完成的:
- 首先向操作系统请求内存来存放 String 对象。
- 在使用完成后,将内存释放,归还给操作系统
其中第一部分由 String::from 完成,它创建了一个全新的 String。
字符与字符串的编码方式的区别:
字符串用 UTF-8 应该是因为它是变长编码,每个字符占用 1 到 4 个字节,这样可以节省存储空间。
字符因为是属于基本类型,在栈上分配,所以长度需要固定,而如果长度固定了,如果这是个可变的变量,那么在字符变量被修改的时候就要确保内存空间是足够的,所以用 Unicode 的最大容量 4 个字节来存储单个字符,而且存的是个 Unicode 代码点整数,而非任何编码。
肥龙软件分享的软件是本站作者开发的免费,无广告,安全可靠,绝不附带任何无关软件,绝不困绑任何插件的实用软件。如果您感觉好用,可以捐赠我们,这样我们可以有更积极的动力去改进升级软件,维持服务器运转,感谢您的捐助,谢谢!

