Pointers 为什么指向堆上某个对象的指针的大小大于堆栈变量的大小?

Pointers 为什么指向堆上某个对象的指针的大小大于堆栈变量的大小?,pointers,reference,rust,smart-pointers,memory-layout,Pointers,Reference,Rust,Smart Pointers,Memory Layout,我有以下堆栈和堆分配变量: let var1 = 10; let var2 = Box::new(10); 打印这些输出相同的值,10: println!("var1 ={} var2 ={}", var1, * var2); 当我使用mem::size\u of_val()检查大小时,var1为4,var2为8 var2不是指向堆的指针吗?为什么指针会大于堆栈变量(var1) 另外,是在println!中使用“*”(即*var2)!()应该做什么不同的事情?无论哪种方法,我都得到10。您没

我有以下堆栈和堆分配变量:

let var1 = 10;
let var2 = Box::new(10);
打印这些输出相同的值,
10

println!("var1 ={} var2 ={}", var1, * var2);
当我使用
mem::size\u of_val()
检查大小时,
var1
为4,
var2
为8

var2
不是指向堆的指针吗?为什么指针会大于堆栈变量(
var1


另外,是在
println!中使用“
*
”(即
*var2
)!()
应该做什么不同的事情?无论哪种方法,我都得到10。

您没有显示如何调用
mem::size\u of_val
的代码,但我从结果中猜测您正在这样做:

println!("var1 size = {}", mem::size_of_val(&var1)); // 4
println!("var2 size = {}", mem::size_of_val(&var2)); // 8
var1
的大小是一个
i32
(4字节)的大小,而
var2
的大小是一个
Box
的大小,它只是一个指针(如果它是一个trait对象,它将是两个指针)。指针始终是
usize
(64位系统上为8字节)

如果先取消对框的引用,则框的大小将是框中内容的大小,您将得到预期的结果:

println!("var2 size = {}", mem::size_of_val(&*var2)); // 4
另外,是在
println!中使用“
*
”(即
*var2
)!()
应该做什么不同的事情?无论哪种方式我都得到10分

println宏,以及
格式
和其他一些函数总是将
&
前置到一个值,以确保它是借用的,而不是移动或复制的。当需要该值时,它将根据需要自动取消引用多次。有关更多详细信息,请参阅