为什么堆上某些东西的指针大小大于堆栈变量的大小?

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)

大小var1i32(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!和其他几个人,总是会在前面加上&一个值,以确保它是借来的,不移动或复制.当需要该值时,它将根据需要自动解除引用次数.有关详细信息,请参阅此答案.