2017-02-21 62 views
2

我有以下重新建立了新和堆分配变量:为什么堆上的某个指针的大小大于堆栈变量的大小?

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)是否应该做任何不同的事情?无论哪种方式,

回答

8

你没有给你的代码调用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个字节)的尺寸,而尺寸的var2Box的大小,这仅仅是一个指针(它是两个指针,如果它是一个性状对象)。指针始终是usize(64位系统上的8个字节)。

如果取消引用框,然后再规模将是盒子的内容,你就会得到结果,你希望:

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

而且,是利用“*”(即,*var2)在println!()应该做任何不同的事情?无论哪种方式,

println!是一个特殊情况,以及format!和其他几个。它将始终引用您传递给它的变量,然后将它们取消引用次数,以达到该值。有关更多详细信息,请参阅this answer