Rust之所有权(一):所有权

深入理解Rust所有权机制 所有的程序都必须和计算机内存打交道,如何从内存中申请空间来存放程序的运行内容,如何在不需要的时候释放这些空间,成了重中之重,也是所有编程语言设计的难点之一。在计算机语言不断演变过程中,出现了三种流派:1、垃圾回收机制(GC),在程序运行时不断寻找不再使用的内存,典型代表:Java、Go。2、手动管理内存的分配和释放, 在程序中,通过函数调用的方式来申请和释放内存,典型代表:C++。3、通过所有权来管理内存,编译器在编译时会根据一系列规则进行检查。 阅读详情

开发环境

  • Windows 10
  • Rust 1.54.0

  • VS Code 1.59.1

 

 



项目工程

这里继续沿用上次工程rust-demo





 所有权

所有权是Rust最独特的特性,它使Rust能够在不需要垃圾收集器的情况下保证内存安全。因此,了解Rust中所有权是如何工作的是很重要的。

什么是所有权

Rust的核心特征是所有权。虽然这个特性很容易解释,但它对语言的其他部分有着深刻的含义。

所有程序都必须在运行时管理它们使用计算机内存的方式。有些语言有垃圾回收机制,在程序运行时不断寻找不再使用的内存;而在另外一些语言中,程序员必须显式地分配和释放内存。Rust使用了第三种方法:内存管理通过拥有系统所有权来管理,编译器在编译时会检查这些规则。在程序运行时,所有的所有权特性都不会减慢程序的运行速度。 

由于所有权对于许多程序员来说是一个新概念,因此需要一些时间才能适应。好消息是,使用Rust和所有权系统规则的经验越多,您就越能够自然地开发安全和高效的代码。

栈和堆

在许多编程语言中,您不必经常考虑堆栈和堆。但是在像Rust这样的系统编程语言中,无论值在堆栈上还是堆上,对语言的行为以及为什么您必须做出某些决定都有更大的影响。部分所有权将在本章后面的部分堆栈和堆中进行描述,因此这里是准备工作中的一个简要说明。

堆栈和堆都是内存的一部分,您的代码可以在运行时使用它们,但是它们是以不同的方式构造的。堆栈按照获取值的顺序存储值,并以相反的顺序删除值。这被称为“先进后出”。想想一堆盘子:当你加更多的盘子,你把它们放在堆的顶部,当你需要一个盘子时,你把一个从上面取下来。从中间或底部添加或移除盘子将不起作用!将数据添加到堆栈上称为压栈,而删除数据则称为出栈。

存储在栈上的所有数据都必须具有已知的固定大小。编译时大小未知的数据或可能更改的大小必须存储在堆中。堆没有那么有组织:当您将数据放到堆上时,需要一定的空间。内存分配器在堆中找到一个足够大的空点,将其标记为在使用中,并返回一个指针,该指针是该位置的地址。这个过程称为堆上的分配,有时简称为仅仅分配。将值推送到堆栈上不考虑分配。因为指针是已知的、固定的大小,所以可以将指针存储在堆栈上,但是当需要实际数据时,必须遵循指针。

想想坐在餐厅里。当你进入时,你向工作人员说明用餐的人数,工作人员找到一个空且合适的桌子,并带领你去那里。如果你的团队中有人迟到了,他们可以通过问你坐到哪里而找到你。

压栈比在堆上分配空间要快,因为栈不需要搜索存储新数据的位置;该位置总是在堆栈的顶部。相比之下,在堆上分配空间需要更多的工作,因为分配程序必须首先找到足够大的空间来保存数据,然后标记以准备下一次分配。

访问堆中的数据比访问堆栈上的数据要慢,因为您必须遵循指针才能到达那里。如果在内存中跳得更少的话,当代处理器的速度会更快。如果处理器能够更好地处理接近其他数据的数据(如堆栈上的数据),而不是离堆更远的数据(就像堆上的数据那样),处理器可以做得更好。在堆上分配大量空间也需要时间。

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

跟踪代码的哪些部分在堆上使用什么数据,最小化堆上重复数据的数量,清理堆上未使用的数据,这样就不会耗尽空间,这些都是所有权解决的问题。一旦您理解了所有权,您就不需要经常考虑栈和堆了,但是知道管理堆数据是所有权存在的原因可以帮助解释为什么它是这样工作的。

所有权规则

  • Rust中的每个值都有一个变量,称为所有者
  • 一次只能有一个所有者
  • 当所有者超出范围时,该值将被删除

变量的作用域

作为所有权的第一个例子,我们将查看一些变量的范围。作用域是项目对其有效的程序中的范围。假设我们有一个变量,如下所示:


let s = "hello";

变量s引用字符串文本,其中字符串的值被硬编码到我们程序的文本中。从声明变量到当前作用域结束为止,变量都是有效的。

在看一个列子

{                           // s在这里无效,还没有声明
        let s = "hello";    // 从这一点开始,s是有效的。

        // do stuff with s
}                      // 此作用域现已结束,s不再有效。

换句话说,这里有两个重要的时间点:

  • 当s进入范围时,它是有效的
  • 在超出范围之前仍然有效

此时,作用域和变量是否有效之间的关系类似于其他编程语言中的关系。现在,我们将在此理解的基础上引入字符串类型string。

字符串类型

前面介绍的类型都存储在堆栈上,并在其作用域结束时从栈中弹出,但我们希望查看堆上存储的数据,并研究Rust如何知道何时清理该数据。

这里我们将使用String作为示例,并集中讨论与所有权相关的String部分。这些方面也适用于其他复杂的数据类型,无论它们是由标准库提供的还是由个人创建的。

我们已经看到了字符串文本,其中字符串值被硬编码到我们的程序中。字符串文字很方便,但并不适合我们可能想使用文本的每一种情况。原因之一是它们是不可变的。另一个原因是,当我们编写代码时,并不能知道每个字符串的值:例如,如果我们想获取用户输入并存储它怎么办?对于这些情况,Rust有第二个字符串类型,String。String在堆上分配,因此能够在编译时存储我们不知道的文本数量。可以使用from函数从字符串文本创建字符串,如下所示:

let s = String::from("hello");

双冒号(::)是一个操作符,它允许我们在字符串类型下命名这个特定的from函数,而不是使用某种名称,比如string_from。

这种字符串是可变的:

fn main() {
    let mut s = String::from("hello");

    s.push_str(", world!"); // push_str() 向String对象追加文字

    println!("{}", s); // 打印“hello,world”
}

内存及分配

在字符串文本的情况下,我们在编译时知道内容,因此文本直接硬编码到最终的可执行文件中。这就是字符串文字速度快、效率高的原因。但这些属性仅来自字符串文本的不可变性。不幸的是,我们不能为在编译时不知道大小,并且在运行程序时其大小可能发生变化的每一段文本放入二进制文件。

对于String类型,为了支持可变的、可增长的文本,我们需要在堆上分配一定数量的内存(编译时不知道)来保存内容。

  • 必须在运行时从内存分配程序中请求内存
  • 当我们使用完String时,我们需要一种将这个内存返回给分配器的方法。

第一部分由我们完成:当我们调用string::from时,它的实现请求它所需的内存。这在编程语言中几乎是通用的。

然而,第二部分则有所不同。在带有垃圾回收器(GC)的语言中,GC跟踪并清理不再使用的内存,我们不需要考虑它。在没有GC的情况下,我们有责任识别何时不再使用内存,并调用代码显式地返回它,就像我们请求它一样。历史上,正确地做到这一点一直是一个困难的编程问题。如果我们忘记了,我们就会浪费内存。如果我们做得太早,就会有一个无效的变量。如果我们做两次,那也是个bug。我们需要对应的allocate 和free。

Rust采用不同的路径:一旦拥有它的变量超出作用域,内存就会自动返回。

  {
        let s = String::from("hello"); // s从这一刻开始有效

        // do stuff with s
    }                                  // 这个范围现在结束了,s不再有效  
                                     

当变量超出作用域时,Rust会为我们调用一个特殊的函数。这个函数叫做drop。

变量和数据交互的方式:移动

看如下示例

let s1 = String::from("hello");
let s2 = s1;

String变量由三个部分组成,显示在左边:一个指向存储字符串内容的内存的指针、一个长度和一个容量。这组数据存储在堆栈上。右边是存放内容的堆上的内存。如图所示

 长度是字符串当前使用的内存(以字节为单位)的大小。容量是字符串从分配器接收的内存总量(以字节为单位)。长度和容量之间的区别很重要,但在这种情况下不重要,所以现在,忽略容量是很好的。

 当我们将S1分配给S2时,字符串数据将被复制,这意味着我们复制堆栈上的指针、长度和容量。我们不复制指针引用的堆上的数据。如图1

 

 如果Rust也复制堆数据时内存的样子。如果RUST这样做,如果堆上的数据很大,S2=S1操作在运行时性能方面可能会非常昂贵。如图2

 前面我们说过,当变量超出作用域时,Rust会自动调用DROP函数,并为该变量清理堆内存。但是图上图1显示了指向同一个位置的两个数据指针.这是一个问题:当s2和s1超出作用域时,它们都会尝试释放相同的内存。这被称为double free error,是我们前面提到的内存安全错误之一。两次释放内存会导致内存损坏,这可能会导致安全漏洞。

为了确保内存安全,在Rust中发生的事情还有一个细节。与其试图复制分配的内存,Rust认为s1不再有效,因此,当s1超出作用域时,Rust不需要释放任何东西。

我们可以尝试编译运行上述代码。

fn main() {
    let s1 = String::from("hello");
    let s2 = s1;

    println!("{}, world!", s1);
}

运行

cargo run

 如果您在使用其他语言时听说过浅拷贝和深拷贝,那么在不复制数据的情况下复制指针、长度和容量的概念可能听起来像是在做一个浅拷贝。但是因为Rust也使第一个变量无效,而不是被称为浅拷贝,所以它被称为“移动”。在这个例子中,我们可以说s1被移动到s2中。所以实际的情况如图3

 这解决了我们的问题!只有s2有效,当它超出作用域时,它将单独释放内存,我们就完成了。

此外,还有一个设计选择是这样暗示的:Rust永远不会自动创建数据的“深”副本。因此,就运行时性能而言,可以假定任何自动复制都是廉价的。

变量和数据交互方式:克隆

如果我们想要深入复制字符串的堆数据,而不仅仅是栈数据,我们可以使用一个名为克隆的通用方法。示例

let s1 = String::from("hello");
let s2 = s1.clone();

println!("s1 = {}, s2 = {}", s1, s2);

这就可以很好地解决上述问题。

栈唯一的数据:复制

先看下面的示例

let x = 5;
let y = x;

println!("x = {}, y = {}", x, y);

这段代码似乎与我们刚刚学到的内容相矛盾:我们没有调用克隆,但是x仍然有效,没有被移动到y中。

原因是编译时具有已知大小的类型(如整型)完全存储在栈上,因此实际值的副本很快就会生成。这意味着在我们创建变量y之后,我们没有理由阻止x是有效的。换句话说,这里的深度复制和浅层复制没有区别,所以调用克隆不会做任何与通常的浅拷贝不同的事情,我们可以忽略它。

Rust有一个特殊的注释,叫做复制特征,我们可以把它放在类型上,比如存储在堆栈上的整数。如果类型实现了复制特性,则在赋值后,旧变量仍然可用。如果类型或其任何部分实现了drop特性,那么Rust会让我们用复制特征注释类型。如果当值超出范围并将复制注释添加到该类型时,类型需要一些特殊的操作,那么我们将得到一个编译时错误。

下面是实现了copy的一些类型:

  • 所有整数类型,如u32
  • 布尔类型bool,值为true和false
  • 所有浮点类型,如f64
  • 字符类型,char
  • 元组,如果它们只包含也实现复制的类型。例如(I32,I32)实现复制,但(I32,String)没实现

所有权和函数

将值传递给函数的语义与将值赋值给变量的语义相似。将变量传递给函数将像赋值一样移动或复制。如:

fn main() {
    let s = String::from("hello");  // 声明s

    takes_ownership(s);             // s在函数中移动
                                    // s无效

    let x = 5;                      // 声明x

    makes_copy(x);                  // x将移动到此函数中
                                    // 但是i32属于复制,所以这里是可以的

}

fn takes_ownership(some_string: String) { 
    println!("{}", some_string);
} // 这里, some_string出作用域,并且Rust会调用drop函数,内存以释放

fn makes_copy(some_integer: i32) { 
    println!("{}", some_integer);
} // 这里, some_integer出作用域,什么也不会发生

如果我们试图在调用takes_ownership之后使用s,Rust会抛出编译错误。这些静态检查保护我们不犯错误。

运行

返回值和范围

返回值也可以传递所有权。如:

fn main() {
    let s1 = gives_ownership();         // gives_ownership移动了它的返回值,并赋给s1 

    let s2 = String::from("hello");     // s2 

    let s3 = takes_and_gives_back(s2);  // takes_and_gives_back将s2移动,同时此函数移动了返回值,赋给s3
                                   
} // s3出作用域被释放 s2出作用域但是被移动 s1出作用域被释放

fn gives_ownership() -> String {             // gives_ownership将会移动返回值

    let some_string = String::from("hello"); // some_string

    some_string                              // some_string作为返回值,并且被移动 
}


fn takes_and_gives_back(a_string: String) -> String { // a_string 

    a_string  // a_string 作为返回值,并且被移动 
}

 运行

变量的所有权每次都遵循相同的模式:将值分配给另一个变量会移动它。当包含堆上数据的变量超出作用域时,将通过DROP清除该值,除非数据已被移动为另一个变量所拥有。

获取所有权,然后用每个函数返回所有权,这有点乏味。如果我们想让一个函数使用一个值,而不使用它的所有权,该怎么办?非常恼人的是,如果我们想要再次使用它,那么传入的任何内容都需要被传回,另外还有我们可能希望返回的函数体产生的任何数据。

可以使用元组返回多个值。示例

fn main() {
    let s1 = String::from("hello");

    let (s2, len) = calculate_length(s1);

    println!("The length of '{}' is {}.", s2, len);
}

fn calculate_length(s: String) -> (String, usize) {
    let length = s.len(); // len() 返回字符串的长度

    (s, length)        // 返回字符串和长度
}

运行

 本章重点

  • 所有权
  • 移动
  • 克隆
  • 复制
rust学习五、认识所有权 按照rust官方的说法,rust要保证内存安全(一定会释放掉),同时还需要保证高效(不能用java 那样的gc管理器),同时还不能太繁琐(像C++那样手动释放)注:第二条规则“任意时刻,一个值只能有一个所有者”这个似乎有问题,因为在书本的第十五章节的Rc(引用计数)指针又声称"然而,有些情况单个值可能会有多个所有者"通过这个提示我们可以看到:在一个作用域之内,如果一个变量转赋给另外一个变量的时候,会发生一件事情:值会从一个变量转到另外一个变量上。一个变量的值被移走后,那么再次使用原来的变量就变得麻烦了。 阅读详情

相关推荐

rust编程学习:所有权模型

rust编程学习:所有权模型

天涯雨的博客 1178

理解Rust的所有权

什么是所有权 Rust的所有权,是一个跨时代的理念,是内存管理的第二次革命。 较低级的语言依赖程序员分配和释放内存,一不小心就会出现空指针、野指针破坏内存;较高级的语言使用垃圾回收的机制管理内存,在程序运行时不断地寻找不再使用的内存,虽然安全,却加重了程序的负担;Rust的所有权理念横空出世,通过所有权系统管理内存, 编译器在编译时会根据一系列的规则进行检查,在运行时,所有权系统的任何功能都不会减...

鸿鹄之志 2046

【Rust所有权机制】Rust所有权机制详细解析与应用实战

所有权(系统)是 Rust 最独特的功能,其令 Rust 无需垃圾回收(garbage collector)即可保障内存安全。 因此,理解Rust 中所有权如何工作是十分重要的。本文我们将讲到所有权以及相关功能:借用、slice 以及 Rust 如何在内存中布局数据。

景天科技苑 6万+

Rust核心功能之一(所有权)

所有权(系统)是 Rust 最为与众不同的特性,对语言的其他部分有着深刻含义。它让 Rust 无需垃圾回收(garbage collector)即可保障内存安全,因此理解 Rust 中所有权如何工作是十分重要的。所有程序都必须管理其运行时使用计算机内存的方式。一些语言中具有垃圾回收机制,在程序运行时有规律地寻找不再使用的内存;在另一些语言中,程序员必须亲自分配和释放内存。Rust 则选择了第三种方式:通过所有权系统管理内存,编译器在编译时会根据一系列的规则进行检查。如果违反了任何这些规则,程序都不能编译。

专注于大数据方向,区块链,前后端,数据可视化,人工智能等领域 2493

《机器人学一(Robotics(1))》_台大林沛群 第 3 周 【机械手臂 顺运动学】Quiz 3

的方向,旋转方向与四指弯曲方向相反,为负, α为 -90。的方向,旋转方向与四指弯曲方向相反,为负, α为 -90。bug 的图 要求解的 i 位置有误 两套 题目?B. 第2个 坐标系 的原点位置 不便于 计算;上面的正确,后两题 有误, 不知道问题在哪里。标准部分, 前面的更常用,这种仅作为 了解。还是计算过程中保留两位有效数字 不符合。2、确定 旋转角 α 正负的右手定则。1、确定坐标系方向的右手定则。可相交,距离为 0。A: 右手拇指指向。小数点后两位,不符合。

weixin_46034116的博客 1242

ERA5数据批量下载

ERA5再分析数据的IDM接管下载

qq_38734327的博客 3034

【Rust 基础篇】Rust 所有权详解

所有权是指对内存资源的控制权和管理权。在Rust中,每个值都有一个唯一的所有者。当所有者超出作用域时,该值将被释放。这种所有权的机制确保了内存资源的安全和高效使用。Rust的所有权系统是一种强大的内存管理机制,它通过移动、克隆和借用操作来管理值的所有权,确保内存安全和避免常见的错误。本篇博客详细介绍了Rust中的所有权概念、所有权规则和最佳实践,并提供了相关代码示例。通过合理使用所有权,我们可以编写出高效、安全和易于维护的Rust代码。

繁依Fanyi的博客 1817

人形机器人硬件电路设计入门

人形机器人属于。

blotemj.blog.youkuaiyun.com 229

Rust的所有权(Ownership)

1. 什么是Ownership Rust的所有权,是一个跨时代的理念,是内存管理的第二次革命。Ownership是Rust的一个核心概念。 每种编程语言都有自己的一套内存管理的方法。有些需要显式的分配和回收内存(如C),有些语言则依赖于垃圾回收器来回收不使用的内存(如Java)。而Rust不属于以上任何一种,它有一套自己的内存管理规则,叫做Ownership。 Rust中常规数据类型,其数据都是存储在栈中,而像String或一些自定义的复杂数据结构(我们以后会对它们进行详细介绍),其数据则存储在堆内存中。

rayylee 2940

【AI智能体】Codex 浏览器操作自动化任务实战操作详解

【AI智能体】Codex 浏览器操作自动化任务实战操作详解

congge 4087

NR PUCCH(一) PUCCH format 0/1

NR中PUCCH物理信道用来发送上行控制信息Uplink Control Information(UCI),当然UCI也可以在PUSCH上发送。UCI 内容包括:CSI,HARQ ACK/NACK ,SR 及上述三者的组合信息。 那先看下PUCCH format ,序列的生成及资源映射的相关内容。 NR中支持5种格式PUCCH,根据PUCCH format占用时域符号长度分为短PUCCH(1-2个符号,PUCCH 0/2)和长PUCCH(4-14个符号,PUCCH1/3/4)。使用短PUCCH 能够支

asd199086的博客 6060

Rust 学习笔记:所有权

Rust 学习笔记:所有权

ProgramNovice的博客 2208

LeRobot 入门教程(七)数据集

LeRobot Dataset v3.0 是机器人学习数据的标准化格式,支持多模态时间序列数据和视频的统一访问。该版本通过基于文件的存储(Parquet/MP4)、关联元数据和Hub原生流式处理等新特性,显著提升了性能并降低了存储开销。文档详细介绍了格式设计、安装使用、数据记录与加载方法,以及从v2.1迁移到v3.0的步骤,特别针对大型数据集(如DROID 1.0.1)的处理提供了SLURM集群移植方案。v3.0通过优化文件组织和元数据管理,实现了更快的加载速度、更高的内存效率和更好的可扩展性。

2506_90492529的博客 2054

RUST 每日一省:所有权

所有权是是Rust语言中的基础设施。Rust中的每个值都必定有一个唯一的所有者,所有者负责该值的释放和读写权限。

The future is already here it's just not evenly distributed。 492

摇骰子、抽奖转盘酒桌游戏 人生重启模拟器小程序源码分享-开通流量主躺着赚钱

摇骰子、抽奖转盘酒桌游戏 人生重启模拟器小程序源码分享-开通流量主躺着赚钱

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1650

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

别的语言靠 GC,Rust 靠“所有权“:没有垃圾回收怎么保证内存安全?(一)什么是所有权

Rust通过所有权系统实现内存安全,无需垃圾回收机制。所有权规则包括:每个值有唯一所有者,离开作用域时值被自动回收。String类型展示了堆内存的管理方式,通过移动(转移所有权)或克隆(深拷贝)实现数据交互,而简单类型如整数直接在栈上拷贝。这种设计避免了二次释放等内存问题,同时保证编译时安全检查。

2501_92963994的博客 396

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Rust中的‘static生命周期:从常量到契约的深度解读

'static是Rust类型系统中一个双重含义的关键字,它既是“永恒”的引用生命周期,也是“自包含”的类型约束。&'static T(引用):一个确保在程序结束前都有效的引用。它指向的数据可以是在编译期确定的(字面量),也可以是在运行时“泄漏”的(Box::leakT: 'static(约束):一个类型安全契约,保证该类型不包含任何“临时”的借用。这是实现安全并发()和动态类型(dyn Any)的基石,它强制数据要么被拥有,要么被永久借用。理解'static。

m0_73236311的博客 795

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Rust之介绍

声明:本系列博客是从Rust官网的教程中翻译过来。官网教程地址欢迎!这本书将会教你有关于Rust这门编程语言。Rust是系统编程语言,它专注于三个目标:安全、效率和并发。这本书被分为八个部分: 开始入门:搭建环境来开发Rust 学习Rust: 通过小的项目来学习Rust 高效的Rust:使用高级的概念来书写完美的Rust代码 语法知识: 将零碎的代码集成代码块 不稳定的Rust: 还没有实现的

闪星的博客 2229

为什么每个Rust开发者都需要rust-memory-container-cs:避免内存管理陷阱的完整清单

Rust内存管理是每个Rust开发者必须掌握的核心技能,而rust-memory-container-cs正是帮助您避免常见内存管理陷阱的终极指南。这个开源项目提供了完整的Rust内存容器速查表,涵盖了从基础概念到高级用法的所有关键信息,让您能够快速查找和理解各种内存容器的特性和适用场景。 ## 📊 Rust内存容器速查表的核心价值 rust-memory-container-cs项目为Ru

gitblog_00458的博客 779

【Rust日报】Rust 的借用检查器本身不是难点——难的是数据流设计

架构上采用"双星系统":两个独立的观测通道围绕同一进程空间运行,各自基于不同的物理机制,形成无法通过攻击单一通道就能使其失效的检测系统。通过CO-RE直接从内核内存读取task_struct,绕过可被hook的helper函数。击败rootkit的PID过滤攻击(如Singularity)SPiCa - 基于eBPF的内核级Rootkit检测引擎。通过硬件PMU周期计数器驱动的非屏蔽中断(NMI)触发。Rust 的借用检查器本身不是难点——难的是数据流设计。NMI无法被软件级的cli/sti指令屏蔽。

Rust语言学习交流 352

五分钟理解Rust的核心概念:所有权Rust

欢迎来到Rust的世界。你可能听说过Rust以其惊人的运行速度、强大的内存安全保证而闻名,甚至连续多年被评为“最受开发者喜爱的编程语言”。而支撑起这一切荣耀的基石,正是我们今天要深入探讨的核心概念——所有权(Ownership)。 对于许多刚从Java、Python、C++等语言转来的开发者来说,“所有权”就像一个神秘的守门人,它严格、挑剔,甚至有点不近人情,常常用编译错误将你拒之门外。但请相信我,一旦你理解了它的工作原理和设计哲学,这位守门人就会变成你最忠诚、最强大的守护骑士。

专注于 C/C++ 后端开发,涵盖基础语法、Linux系统与网络、MySQL数据库、常见算法及项目经验。 2万+

Rust中的所有权是什么

既然我们已经掌握了基本语法,将不会在之后的例子中包含 fn main() { 代码,所以如果你是一路跟过来的,必须手动将之后例子的代码放入一个 main 函数中。这样,例子将显得更加简明,使我们可以关注实际细节而不是样板代码。 在所有权的第一个例子中,我们看看一些变量的 作用域(scope)。作用域是一个项(item)在程序中有效的范围。假设有这样一个变量: 变量 s 绑定到了一个字符串字面值,这个字符串值是硬编码进程序代码中的。这个变量从声明的点开始直到当前 作用域 结束时都是有效的。示例中的注释标明了变

write less , do more 2432

【Rust】所有权

所有权是一套规则,用于管理Rust程序如何使用内存。Rust通过所有权系统来管理内存,编译器会检查这些规则的遵守情况。违反任何规则将导致程序无法编译。所有权的特点是不会影响程序的运行速度。

qq_61867911的博客 1587

Rust学习总结之所有权(一)

不管是计算机的哪种语言,都有内存的管理方式。主流有两种,一是以C为代表的由开发者来决定申请和释放内存,二是以Python为代表的通过语言本身的垃圾回收机制来自动管理内存。Rust开辟了第三种方式,通过所有权系统管理内存。Rust所有权规则,下面的例子都将围绕下面的3条所有权规则来展开讲解owner。

ftzchina的博客 1057
上一篇: Rust之流程控制
下一篇: Rust之所有权(二):引用和借用
枫★曦
博客等级 码龄19年 251粉丝 153原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值