Rust系列(二) 内存管理

这篇具有很好参考价值的文章主要介绍了Rust系列(二) 内存管理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上一篇:Rust系列(一) 所有权和生命周期

通过前面的文章,目前我已经了解到了单一所有权、Move语义、Copy语义、可变和不可变借用以及引用计数。突然回首可以发现,Move 语义和 Copy 语义保证了值的单一所有权;而可变和不可变借用又可以避免对象在作为函数参数进行传递时造成额外的内存开销;引用计数提供了一种突破值的单一所有权限制的手段,得以实现多线程操作同一块内存和实现DAG等操作,使得 rust 和其他语言一样的灵活。

而上述的这些场景我们可以发现最终都是为了合理的管理内存,它希望在生命周期内就可以确定值内存的释放时机,而不必像Java和Go一样需要引入垃圾回收,也不必需要像C一样需要手动维护内存的申请和释放。
显然,对于栈变量,其内存管理和维护与函数的堆栈密切相关,我们无需特别关心,其在编译期间就已经确定了创建、存放和销毁的时机地点。而对于堆上创建的变量,由于其容量大小和生命周期都是动态的,所以管理和维护相对较为复杂。

➿如何管理堆内存?

rust 的创造者们,重新审视了堆内存的生命周期,发现大部分堆内存的需求在于动态大小,小部分需求是更长的生命周期。所以它默认将堆内存的生命周期和使用它的栈内存的生命周期绑在一起,并留了个小口子 leaked 机制(想起了上一篇文章里面的Rc::new方法),让堆内存在需要的时候,可以有超出栈帧存活的生命周期。
Rust系列(二) 内存管理,rust,开发语言,后端

1. 结构体内存对齐

C语言的对齐规则如下,而 rust在编译器层面进行了优化:
● 首先确定每个域的长度和对齐长度,原始类型的对齐长度和类型的长度一致。
● 每个域的起始位置要和其对齐长度对齐,如果无法对齐,则添加 padding 直至对齐。
● 结构体的对齐大小和其最大域的对齐大小相同,而结构体的长度则四舍五入到其对齐的倍数。

use std::mem::{align_of, size_of};

struct S1 {
    a: u8,
    b: u16,
    c: u8,
}

struct S2 {
    a: u8,
    c: u8,
    b: u16,
}

fn main() {
    // sizeof S1: 4, S2: 4
    println!("sizeof S1: {}, S2: {}", size_of::<S1>(), size_of::<S2>());
    // alignof S1: 2, S2: 2
    println!("alignof S1: {}, S2: {}", align_of::<S1>(), align_of::<S2>());
}

2. enum

Rust 下 enum 是一个标签联合体(tagged union),它的大小是标签的大小+最大类型的长度。通过 size_of 方法可以很方便的实验出不同平台下,不同类型 enum 的大小:

enum E1 {
    DblVal1(f64),
}

enum E2 {
    DblVal1(f64),
    DblVal2(f64),
    DblVal3(f64),
    DblVal4(f64),
}

fn main() {
    // Size is 8
    println!("Size is {}", std::mem::size_of::<E1>());
    // Size is 16
    println!("Size is {}", std::mem::size_of::<E2>());
    // Size is 24
    println!("Size is {}", std::mem::size_of::<String>());
    // Size is 24
    println!("Size is {}", std::mem::size_of::<Result<String, ()>>());
}

有关具体的使用方法请参考官方文档,和 Java 等其他语言 enum 一个比较大的区别是, Rust enum 内部的每一个枚举可以是不同的类型。此外 Rust enum 的内存设计也和其他语言有较大不同,可以参考这个链接进行学习。

3. vec<Type> 和 String

fn main() {
    // Size is 24
    println!("Size is {}", std::mem::size_of::<String>());
    // Size is 24
    println!("Size is {}", std::mem::size_of::<Vec<u8>>());
}

从上面输出可以看到 StringVec<u8> 内存大小都是 24 个字节。其实,String 结构的底层就是 Vec<u8> 数组。而 Vec<T> 类型的内存布局也和 cpp 里面的 vector 内存布局相似,包含一个指向堆内存的指针 pointer、分配的堆内存的容量 capacity,以及数据在堆内存的长度 length

📫推荐一个Rust备忘录开源项目: https://github.com/ralfbiedert/cheats.rs/

下一篇:Rust系列(三) 类型系统文章来源地址https://www.toymoban.com/news/detail-550408.html

到了这里,关于Rust系列(二) 内存管理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Rust-内存安全

    Rust-内存安全

    一个进程在执行的时候,它所占用的内存的虚拟地址空间一般被分割成好几个区域,我们称为“段”(Segment)。常见的几个段如下。 代码段。编译后的机器码存在的区域。一般这个段是只读的。 bss段。存放未初始化的全局变量和静态变量的区域。 数据段。存放有初始化的全局

    2024年01月20日
    浏览(3)
  • 建站系列(六)--- 后端开发语言

    建站系列(一)— 网站基本常识 建站系列(二)— 域名、IP地址、URL、端口详解 建站系列(三)— 网络协议 建站系列(四)— Web服务器之Apache、Nginx 建站系列(五)— 前端开发语言之HTML、CSS、JavaScript 建站系列(六)— 后端开发语言 建站系列(七)— 常用前后端框架

    2024年02月09日
    浏览(13)
  • Rust 开发的高性能 Python 包管理工具,可替换 pip、pip-tools 和 virtualenv

    Rust 开发的高性能 Python 包管理工具,可替换 pip、pip-tools 和 virtualenv

    最近,我在 Python 潮流周刊 中分享了一个超级火爆的项目,这还不到一个月,它在 Github 上已经拿下了 8K star 的亮眼成绩,可见其受欢迎程度极高!国内还未见有更多消息,我趁着周末把一篇官方博客翻译出来了,分享给大家。 作者:@charliermarsh 译者:豌豆花下猫@Python猫 英

    2024年03月09日
    浏览(20)
  • 【Rust教程 | 基础系列1 | Rust初相识】Rust简介与环境配置

    【Rust教程 | 基础系列1 | Rust初相识】Rust简介与环境配置

    Rust是一种系统编程语言,专注于速度、内存安全和并行性。它的设计目标是提供一种能够实现高性能系统的语言,同时保证内存安全和线程安全。 本篇教程的目标是通过融合理论与实践,帮助读者更快速、更有效地学习 Rust,并解决在学习过程中可能遇到的挑战。这些内容也

    2024年02月15日
    浏览(9)
  • Rust in Action笔记 第六章 内存

    Rust in Action笔记 第六章 内存

    OptionT 类型在Rust中使用了空指针优化(null pointer optimization)来保证该类型在编译后的二进制文件中占用0个字节。 None 变量是通过一个空指针 null pointer 来表示; 内存地址、指针、引用的区别,内存地址是指在内存中的一个字节,由汇编语言提供的一个抽象;指针,有时候也

    2024年02月08日
    浏览(25)
  • 【ChatGPT辅助学Rust | 基础系列 | Hello, Rust】编写并运行第一个Rust程序

    【ChatGPT辅助学Rust | 基础系列 | Hello, Rust】编写并运行第一个Rust程序

    在开始学习任何一门新的编程语言时,都会从编写一个简单的 “Hello, World!” 程序开始。在这一章节中,将会介绍如何在Rust中编写并运行第一个程序。 在终端中,使用Cargo(Rust的构建系统和包管理器)创建一个新的二进制项目。输入以下命令: 这将会在当前目录下创建一个

    2024年02月14日
    浏览(20)
  • 用了这么多年Rust终于搞明白了内存分布!

    用了这么多年Rust终于搞明白了内存分布!

    Rust作为一门学习曲线十分陡峭的语言,掌握其核心基础数据结构的内存分布对学习Rust会有很大的帮助,即使对于已经熟悉Rust的同学,深入数据结构分布也能帮助到调优Rust程序。 接下来,我会由浅入深仔细介绍Rust的各个数据结构在内存中的分布情况,帮助大家学习Rust。 先

    2024年02月02日
    浏览(25)
  • 【rust语言】rust多态实现方式

    学习rust当中遇到了这个问题,记录一下,不对地方望指正 多态是面向对象程序设计中的一个重要概念,指同一个行为或操作在不同实例上具有不同的行为或结果。简单来说,多态就是指同一种类型的对象,在不同的上下文中有不同的行为。多态性使得程序可以更加灵活、可

    2024年02月11日
    浏览(12)
  • Rust所有权系统:内存安全与性能优化的秘密

    本文将深入探讨Rust编程语言的核心特性——所有权系统。通过丰富的实例和应用场景,帮助你理解所有权系统的工作原理及其在实际编程中的优势。 Rust是一种注重安全、性能和并发性的系统编程语言。它因其独特的所有权系统而备受关注,这一系统有效地解决了内存安全问

    2024年04月13日
    浏览(11)
  • 深入浅出Rust内存安全:构建更安全、高效的系统应用

    深入浅出Rust内存安全:构建更安全、高效的系统应用

    在过去几年中,Rust编程语言以其独特的安全保障特性和高效的性能,成为了众多开发者和大型科技公司的新宠。尤其是其内存安全特性,成为了广泛讨论和赞扬的焦点。本文旨在深入探讨内存安全的概念、Rust在内存安全方面的独到之处,以及这些特性对系统开发的深远影响

    2024年02月19日
    浏览(15)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包