当前位置:网站首页>Rust 所有权进阶 -- 内存管理
Rust 所有权进阶 -- 内存管理
2022-06-27 17:58:00 【用户3147702】
1. 引言
此前的文章中,我们介绍了 Rust 的所有权:
所有权机制让 Rust 可以方便地实现内存的自动回收,但是 Rust 究竟是如何来划分和管理内存的呢?本文来介绍一下。
2. 内存的分配 -- 堆和栈
和很多其他语言一样,Rust 也将内存换分为堆和栈两个部分。由于 Rust 语言是一种系统级编程语言,我们在编写过程中是必须要清楚到底内存是被分配到堆空间还是栈空间的,不过通常,在栈中放置数据并不称为“分配”,而是“压入”。
在 Rust 中,只有在编译期已知且固定大小的数据会被分配在栈空间上,而那些编译期无法确定大小的数据,则只能被放置在堆空间中。
举个例子来说,Rust 中的字符串有两种类型:
// &str 类型
let str1 = "hello world!";
// String 类型
let str2 = String::from("hello");
str1 是 &str
类型,它的值是大小固定且内容不可变的,他在编译期已经可以确定使用内存的大小,因此,str1 会被压到栈上。
str2 是 String
类型,这是一种 Rust 的封装类型,它是可变的字符串类型,例如,你可以通过下面的方法为 str2 添加新的内容:
str2.push_str(" world!");
因此,String 类型的 str2 是被分配在堆空间的,尽管如此,实际上,在栈空间中仍然会压入一个结构,用来保存指向堆空间的指针、此次分配堆空间的容量,以及已使用长度。
3. 内存的释放
由于堆空间是在运行时动态分配的,所以和许多其他语言一样,堆空间的清理也是我们需要考虑的问题,Rust 的所有权机制很大程度上解决了这个问题。
当变量离开作用域时,根据所有权机制,Rust 会自动调用一个名为 drop
的特殊函数,在这个函数中,Rust 会释放所有不在被所有的内存。
此前的文章中,我们介绍了 Rust 的“移动”机制,简单的来说,就是对于基础类型,当把一个变量赋值给另一个变量时,Rust 会为新的变量在栈空间开辟一个新的空间,将原值复制一份,从而让两个变量在当前作用域内均为可用,这里说的“基础数据类型”只包括:
- 所有整数类型,包括有符号、无符号的类型,如 u32、i64 等;
- 布尔类型 bool;
- 字符类型 char。
而对于在堆空间中分配的数据来说,当把一个变量赋值给另一个变量时,Rust 会销毁原变量,数据的所有权被移动
到了新的变量上。
这样的差别是为什么呢?假设保存着指向堆空间中数据的变量内容复制一份给新的变量,那么就会出现一个堆数据被两个指针指向的情况。当两个变量退出作用域时,Rust 就必须判断究竟要释放这个堆数据几次,并且在这样的情况下,修改一个变量就意味着另一个变量指向的实际数据发生了修改,行为仍然与基础类型不同。事实上,最好的解决办法是同步复制堆空间中的数据,也就是其他很多语言中的“深拷贝”,但这样一来性能势必受到极大地影响。因此,经过权衡,Rust 通过“移动”的策略来实现了堆空间变量的赋值。
边栏推荐
- redis集群系列二
- 数仓的字符截取三胞胎:substrb、substr、substring
- NVIDIA Clara-AGX-Developer-Kit installation
- 429-二叉树(108. 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树、 106.从中序与后序遍历序列构造二叉树、235. 二叉搜索树的最近公共祖先)
- UE4实现长按功能
- 券商经理的开户二维码开户买股票安全吗?有谁知道啊
- binder hwbinder vndbinder
- Redis 原理 - String
- Garbage collector driving everything -- G1
- 广发期货开户安全吗?
猜你喜欢
Oracle 获取月初、月末时间,获取上一月月初、月末时间
在线文本按行批量反转工具
Mathematical derivation from perceptron to feedforward neural network
Solution of adding st-link to Huada MCU Keil
PCB线路板蛇形布线要注意哪些问题?
What is ssr/ssg/isr? How do I host them on AWS?
binder hwbinder vndbinder
Core dynamic Lianke rushes to the scientific innovation board: with an annual revenue of 170million yuan, Beifang Electronics Institute and Zhongcheng venture capital are shareholders
Don't worry. This is the truth about wages in all industries in China
Array exercises follow up
随机推荐
拥抱云原生:江苏移动订单中心实践
shell脚本常用命令(四)
可靠的分布式锁 RedLock 与 redisson 的实现
429-二叉树(108. 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树、 106.从中序与后序遍历序列构造二叉树、235. 二叉搜索树的最近公共祖先)
Introduction to deep learning and neural networks
Batch insert data using MySQL bulkloader
聊聊毕业季
今晚战码先锋润和赛道第2期直播丨如何参与OpenHarmony代码贡献
Function key input experiment based on stm32f103zet6 Library
Informatics Olympiad 1333: [example 2-2] blah data set | openjudge noi 3.4 2729:blah data set
基础数据类型和复杂数据类型
Oracle 获取月初、月末时间,获取上一月月初、月末时间
MySQL初学者福利
華大單片機KEIL報錯_WEAK的解决方案
# Leetcode 821. 字符的最短距离(简单)
Memoirs of actual combat: breaking the border from webshell
Solution of adding st-link to Huada MCU Keil
高收益银行理财产品在哪里看?
Determine whether a variable is an array or an object?
1027 Colors in Mars