The Rust book gives a representation of a reference to an owned type, and it looks like this:enter image description here

我的问题是,当多个引用"堆叠"在内存中时会是什么样子?例如: let y = &&someString;

如果只有一个和号,使用上面的图片会很容易理解,但是有两个或更多的和号,我会感到困惑.没有中间值可以指向,那么Rust如何在内存中表示它呢?

let x = &5也有类似的情况.既然x存储了对5的引用,那么5在哪里?

我不一定要寻找何时以及如何使用这些具体 case ,我只是好奇当这些事情发生时,幕后会发生什么.

谢谢!

翻阅了铁 rust 书和其他网站,但都无济于事.

推荐答案

内存表示与您预期的一模一样.引用是通过存储被引用类型的地址来"指向"被引用类型的指针.因为引用在Rust中也是一流的类型,所以&&T是指向T的指针--没有什么好笑的.

因此,问题是:中间参照在哪里?如果每件事都说得很清楚,那么毫无疑问:

let s: String = ...;
let ref_s: &String = &s;
let ref_ref_s: &&String = &ref_s;

但是,如果您只使用一行代码:

let s: String = ...;
let ref_ref_s: &&String = &&s;

由于为temporary lifetime extension,编译器将其视为-如果您执行了第一个:

let s: String = ...;
let _tmp: &String = &s;
let ref_ref_s: &&String = &_tmp;

这可以让let ... = &&&...个人也能工作.注意:这个公式是专门针对let的,它不适用于作业(job).

那么,中间参照在哪里呢?它们位于您定义变量的本地作用域中.

在其他情况下,比如将&&&T传递给函数:some_func(&&&some_param), idea 是相同的,但作用域只有在该表达式完成之前才有效.有关其他站点和行为,请参见temporary scopes.


从技术上讲,let x = &5有点不同,因为5是一个常量,可以是promoted.从本质上讲,5被嵌入到程序的静态内存中,因此x只是指向它的'static引用.

Rust相关问答推荐

为什么父作用域中的变量超出了子作用域

在‘await’点上使用‘std::同步::Mutex’是否总是会导致僵局?

在决定使用std::Sync::Mutex还是使用Tokio::Sync::Mutex时,操作系统线程调度是考虑因素吗?

Tokio_Postgres行上未显示退回特性的生存期,且生命周期 不够长

是否可以在不切换到下一个位置的情况下获得迭代器值:

从未排序的链表中删除重复项的铁 rust 代码在ELSE分支的低级上做了什么?

解析程序无法在Cargo 发布中 Select 依赖版本

如何初始化选项<;T>;数组Rust 了?

我应该如何表达具有生命周期参数的类型的总排序,同时允许与不同生命周期进行比较?

为什么我可以使用 &mut (**ref) 创建两个实时 &mut 到同一个变量?

相当于 Rust 中 C++ 的 std::istringstream

Rust Redis 中的 HSET 命令问题

Rust 中的生命周期:borrow 的 mut 数据

在 Rust 中,我如何处理请求 javascript 的页面?

使用自定义 struct 收集 Vec

为什么 for_each 在释放模式(cargo run -r)下比 for 循环快得多?

如何获得对数组子集的工作可变引用?

如何在 Rust 中编写涉及异步的重试函数

如何在 nom 中构建负前瞻解析器?

为什么 u64::trailing_zeros() 在无分支工作时生成分支程序集?