我有以下堆栈和堆分配的变量:
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
的大小,这只是一个指针(如果它是一个 trait 对象,它将是两个指针)。指针始终是usize
(64 位系统上为 8 个字节)。
如果先取消引用框,则大小将是框内容的大小,您将获得预期的结果:
println!("var2 size = {}", mem::size_of_val(&*var2)); // 4
另外,在
println!()
中使用"*
"(即*var2
)应该有什么不同吗?无论哪种方式,我都会得到 10 个。
println!
宏以及format!
和其他一些宏将始终在值前面附加&
,以确保借用、移动或复制该值。当需要该值时,它将根据需要多次自动取消引用。有关更多详细信息,请参阅此答案。