个人专栏:

 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客

Java基础:Java基础_IT闫的博客-CSDN博客

c语言:c语言_IT闫的博客-CSDN博客

MySQL:数据结构_IT闫的博客-CSDN博客

数据结构:​​​​​​数据结构_IT闫的博客-CSDN博客

C++:C++_IT闫的博客-CSDN博客

諒C51单片机:C51单片机(STC89C516)_IT闫的博客-CSDN博客

基于HTML5的网页设计及应用:基于HTML5的网页设计及应用_IT闫的博客-CSDN博客​​​​​​

累python:python_IT闫的博客-CSDN博客

离散数学:离散数学_IT闫的博客-CSDN博客

​​​​​​諒Linux:​​​​Linux_Y小夜的博客-CSDN博客

Rust:Rust_Y小夜的博客-CSDN博客

欢迎收看,希望对大家有用!

目录

官方解释

共同点

区别

諒栈的特点

諒堆的特点

所有权存在的原因

官方解释

        所有权(系统)是 Rust 最为与众不同的特性,对语言的其他部分有着深刻含义。它让 Rust 无需垃圾回收(garbage collector)即可保障内存安全,因此理解 Rust 中所有权如何工作是十分重要的。本章,我们将讲到所有权以及相关功能:借用(borrowing)、slice 以及 Rust 如何在内存中布局数据。

        所有程序都必须管理其运行时使用计算机内存的方式。一些语言中具有垃圾回收机制,在程序运行时有规律地寻找不再使用的内存;在另一些语言中,程序员必须亲自分配和释放内存。Rust 则选择了第三种方式:通过所有权系统管理内存,编译器在编译时会根据一系列的规则进行检查。如果违反了任何这些规则,程序都不能编译。在运行时,所有权系统的任何功能都不会减慢程序。

共同点

栈和堆都是代码在运行时可供使用的内存,但是它们的结构不同。

区别

諒栈的特点

        栈以放入值的顺序存储值并以相反顺序取出值。这也被称作 后进先出(last in, first out)。

        增加数据叫做 进栈(pushing onto the stack),而移出数据叫做 出栈(popping off the stack)。

        栈中的所有数据都必须占用已知且固定的大小。

        入栈比在堆上分配内存要快,因为(入栈时)分配器无需为存储新数据去搜索内存空间;其位置总是在栈顶。

        当你的代码调用一个函数时,传递给函数的值(包括可能指向堆上数据的指针)和函数的局部变量被压入栈中。当函数结束时,这些值被移出栈。

諒堆的特点

        在编译时大小未知或大小可能变化的数据,要改为存储在堆上。 

        堆是缺乏组织的:当向堆放入数据时,你要请求一定大小的空间。

        内存分配器(memory allocator)在堆的某处找到一块足够大的空位,把它标记为已使用,并返回一个表示该位置地址的 指针(pointer)。这个过程称作 在堆上分配内存(allocating on the heap),有时简称为 “分配”(allocating)。

        在堆上分配内存则需要更多的工作,这是因为分配器必须首先找到一块足够存放数据的内存空间,并接着做一些记录为下一次分配做准备。

        访问堆上的数据比访问栈上的数据慢,因为必须通过指针来访问。现代处理器在内存中跳转越少就越快(缓存)。

所有权存在的原因

所有权解决的问题:

        -跟踪代码的哪些部分正常使用heap的哪些数据。

        -最小化heap上的重复数据量。

        -清理heap上未使用的数据,以免空间不足。

一旦你懂的了所有权,那么就不需要经常去想stack或heap了。但是知道管理heap数据是所有权存在的原因,这有助于解释它为什么这样工作。

参考文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。