Gri*_*zly 6 clone owner shallow-copy ownership rust
我从未尝试过 C、C++、Go 等语言,所以我决定从 Rust 开始,我已经了解了一些堆栈和堆是什么,但是,移动变量的真正含义是什么?文档说它不是浅拷贝:
\n\n\n...可能听起来像是在制作浅拷贝。但因为 Rust 也使第一个变量无效,所以它不称为浅拷贝,而是\xe2\x80\x99s 称为移动。在这个例子中,我们会说它
\ns1被移入s2......
例如:
\n let s1 = String::from("hello");\n let s2 = s1;\n\n println!("{}, world!", s1);\nRun Code Online (Sandbox Code Playgroud)\n当文档说“无效”时,它是什么意思?这是否意味着 Rust使tos1中的值无效并赋值,因此...不存在?o 它有什么价值吗?,这主要是我不明白的,它真的能打动它吗?或者记忆中还有什么价值吗?s1s2s1s1
据我所知,这个检查发生在编译时,所以它让我认为s1内存中实际上不存在并且仅存在s2,因为 s1 实际上被移动到了s2。
显然,这种情况发生在大小未知的值(即堆中)上。
\n我希望你能帮助我理解。:)
\n对于您提出的几乎每个是/否问题,答案都是“是”和“否”。我们可以在两个不同的上下文中回答这个问题:语言的语义,以及编译器对代码的处理方式。
从语义上讲,s1将值移入 后就无法再读取s2。可以将其初始化为新String值,然后再次使用。从某种意义上说,“未初始化”和“移出”实际上是相同的状态,因为您必须先为变量分配一些内容,然后才能使用它。(它们在编译器给出的消息中有点不同,并且结构的子值可以移动,但不能取消初始化。)
编译器会用这个做什么?嗯,这可能取决于许多因素,包括(但不限于)编译器的版本和所选的优化级别。如果编译器愿意,它可以完全消除移动,因此s2实际上成为与 相同的内存区域的另一个名称s1。它还可以s2在堆栈上提供自己的内存区域,并将内容传输s1到其中。关于编译器功能的任何具体答案都必须通过对编译环境、编译器版本和提供给编译器的标志的完整描述来限定。
显然,这种情况发生在大小未知的值(即堆中)上。
任何拥有的(和未固定的)值都可以移动,无论它是否管理堆上的分配。通常,堆分配本身不会移动。指向堆分配的指针被移动到新位置。(例如,移动 aString或 aVec不会更改存储实际内容的内存位置。指向该数据的指针只是易手。)
| 归档时间: |
|
| 查看次数: |
2196 次 |
| 最近记录: |