rust学习笔记一

sean 编辑于2022-05-18 10:56Rust

Stack 栈,后进先出(LIFO)。

  1. 栈的数据必须占用已知的大小,而且大小固定的内存空间。
  2. 写入栈数据比在堆上分配内存要快。因为如栈时操作系统无需分配新的空间,只需要将数据放入栈中即可。而在堆上分配内存,需要操作系统先寻找一块大小能够装下数据的内存空间(操作系统分配大量内存空间需要消耗时间),然后,记录内存地址,然后再写入。
  3. 读取速度比在堆的读取速度快。现代cpu,栈数据可以存放在高速缓存(比内存速度快10倍以上)中,而堆数据只能存放在内存中,访问堆数据会慢于栈,访问堆数据需要先访问栈,获取到堆的内存地址(增加了寻址的时间),寻址让后再访问内存,速度必然会慢。

 

Heap 堆,当数据大小未知或者可能变化的数据,存在堆上。

  1. 需要向系统申请堆的内存空间,返回堆的指针。然后,通过栈中的指针来获取堆的内存地址,然后访问堆中数据。(增加了寻址的时间)
  2. 写入速度比入栈要慢。(操作系统分配空间耗时,写入内存耗时)
  3. 读取速度比栈慢。
  4. 堆上的数据缺乏组织,因此跟踪这些数据何时分配和释放是非常重要的,否则堆上的数据将产生内存泄漏 —— 这些数据将永远无法被回收。

 

所有权原则

  1. 每一个值都被一个变量所拥有,该变量被称为该值的所有者。
  2. 一个值同时只能被一个变量所拥有,或者说一个值只能拥有一个所有者。
  3. 当所有者(变量)离开作用域(scope)范围时,这个值将被丢弃(drop)。

 

用所有权来管理Heap数据:

  1. 用所有权来跟踪代码的哪些部分在使用heap的数据。
  2. 最小化heap的重复数据
  3. 清理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 代码点整数,而非任何编码。

 

 

 

关于本站

肥龙软件分享的软件是本站作者开发的免费,无广告,安全可靠,绝不附带任何无关软件,绝不困绑任何插件的实用软件。如果您感觉好用,可以捐赠我们,这样我们可以有更积极的动力去改进升级软件,维持服务器运转,感谢您的捐助,谢谢!

致谢 赞赏/捐助名单

2024-8-13 **军 ¥16.8

更新时间:2024.8.31

联系作者(邮箱)
分类