2017-02-21 30 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