Moy*_*ium 1 memory reference rust
我的问题是,当多个引用“堆叠”时,它在内存中是什么样子?例如:
let y = &&someString;
如果只有一个 & 符号,使用上图很容易理解,但是如果有两个或多个 & 符号,我就会感到困惑。没有中间值可以指向,那么Rust如何在内存中表示这个呢?
有类似的东西let x = &5。由于 x 存储了对 5 的引用,那么 5 存放在哪里?
我不一定要寻找何时以及如何使用这些特定案例,我只是好奇当这些事情发生时幕后发生了什么。
谢谢你!
查遍了rust book和其他网站都没有结果。
内存表示与您所期望的完全一样。引用是一个指针,它通过存储其地址来“指向”所引用的类型。而且因为引用在 Rust 中也是一流的类型,所以 a&&T是一个指向 a 的指针T——这没有什么有趣的事情发生。
所以问题是:中间引用位于哪里?如果所有内容都明确说明,那么就没有问题了:
let s: String = ...;
let ref_s: &String = &s;
let ref_ref_s: &&String = &ref_s;
Run Code Online (Sandbox Code Playgroud)
但是,如果您在一行中执行此操作:
let s: String = ...;
let ref_ref_s: &&String = &&s;
Run Code Online (Sandbox Code Playgroud)
由于临时生命周期延长,编译器将其视为您已完成第一个操作:
let s: String = ...;
let _tmp: &String = &s;
let ref_ref_s: &&String = &_tmp;
Run Code Online (Sandbox Code Playgroud)
这也可以嵌套let ... = &&&...并允许工作。注意:此公式特定于let,例如,它不适用于作业。
那么中间参考在哪里呢?它们位于您定义变量的本地范围内。
在其他情况下,例如传递&&&T给函数:some_func(&&&some_param),想法是相同的,但作用域仅在该表达式完成之前有效。请参阅其他网站和行为的临时范围。
从技术上讲,let x = &5有点不同,因为5是一个常数并且可以提升。本质上,它们5被嵌入到程序的静态内存中,因此x只是'static指向它的引用。
| 归档时间: |
|
| 查看次数: |
177 次 |
| 最近记录: |