为什么指向堆上某物的指针的大小大于堆栈变量的大小?

Why is the size of a pointer to something on the heap larger than the size of a stack variable?

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

let var1 = 10;
let var2 = Box::new(10);

打印这些输出相同的值,10:

println!("var1 ={} var2 ={}", var1, * var2);

当我使用 mem::size_of_val() 检查大小时,var1 是 4,var2 是 8。

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

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

您没有显示有关如何调用的代码 mem::size_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的大小,即只是一个指针(如果它是一个特征对象,它将是两个指针)。指针始终是 usize(在 64 位系统上为 8 个字节)。

如果您首先取消引用该框,那么大小将是该框内容的大小,您将得到您期望的结果:

println!("var2 size = {}", mem::size_of_val(&*var2)); // 4

Also, is the use of "*" (i.e., *var2) in the println!() supposed to do anything different? I get 10 either way.

println! 宏以及 format! 和其他一些宏,将始终在值前加上 & 以确保它是借用的,而不是移动或复制的。当需要该值时,它会根据需要自动取消引用多次。有关详细信息,请参阅