4th*_*ace 3 pointers reference smart-pointers memory-layout rust
我有以下堆栈和堆分配的变量:
let var1 = 10;
let var2 = Box::new(10);
Run Code Online (Sandbox Code Playgroud)
打印这些输出相同的值,10:
println!("var1 ={} var2 ={}", var1, * var2);
Run Code Online (Sandbox Code Playgroud)
当我检查尺寸时mem::size_of_val(),var1是4并且var2是8.
不是var2指向堆的指针?为什么指针大于堆栈变量(var1)?
是,使用" *"(即*var2)println!()应该做什么不同?无论如何,我得到10分.
Pet*_*all 10
您没有显示您调用的代码,mem::size_of_val但我从结果中猜测您正在执行此操作:
println!("var1 size = {}", mem::size_of_val(&var1)); // 4
println!("var2 size = {}", mem::size_of_val(&var2)); // 8
Run Code Online (Sandbox Code Playgroud)
大小var1是i32(4个字节)的大小,而大小var2是a的大小Box,它只是一个指针(如果它是一个特征对象,它将是两个指针).指针总是一个usize(64位系统上的8个字节).
如果您首先取消引用该框,那么该大小将是该框的内容的大小,您将获得您期望的结果:
println!("var2 size = {}", mem::size_of_val(&*var2)); // 4
Run Code Online (Sandbox Code Playgroud)
是,使用"
*"(即*var2)println!()应该做什么不同?无论如何,我得到10分.
在println!宏观,随着format!和其他几个人,总是会在前面加上&一个值,以确保它是借来的,不移动或复制.当需要该值时,它将根据需要自动解除引用次数.有关详细信息,请参阅此答案.
| 归档时间: |
|
| 查看次数: |
540 次 |
| 最近记录: |