2017-02-21 8 views
2

Iは、以下stack-とヒープに割り当てられた変数を有する:var1 4とvar2であり、Iはmem::size_of_val()を使用してサイズを確認するときヒープ上のものへのポインタのサイズがスタック変数のサイズよりも大きいのはなぜですか?

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

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

は、これらの出力を同じ値、10を印刷は8です。

ヒープへのポインタはvar2ではありませんか?ポインタがスタック変数(var1)よりも大きいのはなぜですか?

また、println!()の中で "*"(つまり、*var2)を使用していますか?私はいずれかの方法で10を取得します。

答えて

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のサイズです。これは単なるポインタです(traitオブジェクトの場合は2つのポインタになります)。ポインタは常にusize(64ビットシステムでは8バイト)です。

あなたはボックス参照解除まず、その大きさは、ボックスの内容のものであろうと、あなたが期待する結果を得るだろう場合:

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

をまた、「*」の使用である(つまり、 、*var2)で何か別のことをやろうとしていますか?私はいずれかの方法で10を取得します。

は、format!などの特殊なケースです。それはあなたが渡す変数を常に参照し、値に到達するのに必要な回数だけ逆参照します。詳細については、this answerを参照してください。

関連する問題