メモ書きです。
もうちょっと詳しく調べたいため、書き残しておきます(こうやって公開しておけば、サボらずに調べるでしょきっと!)。
何か知ってたり、指摘がある場合はコメントしてください。嬉しいです。
Immutableな即値のリファレンス
fn main() {
let s = &1000u32;
let t = &1000u32;
println!("s :{}, {:p}, {:p}", *s, s, &s);
println!("t :{}, {:p}, {:p}\n", *t, t, &t);
}
結果はこう。
s :1000, 0x560b2a7ec5c0, 0x7ffe04f9aa90
t :1000, 0x560b2a7ec5c0, 0x7ffe04f9aa98
変数sとtは同じアドレスを指している(へぇー)。
でも変数自体の番地は違うな(当たり前)。
Mutableな即値のリファレンス
fn main() {
let s = &mut 1000u32;
let t = &mut 1000u32;
println!("s :{}, {:p}, {:p}", *s, s, &s);
println!("t :{}, {:p}, {:p}\n", *t, t, &t);
}
結果はこう。
s :1000, 0x7ffd8c5934fc, 0x7ffd8c5934f0
t :1000, 0x7ffd8c59350c, 0x7ffd8c593500
あー、ふーん...(わからん)。
なるほど...?つまりこういう事か?
immutableな時とmutableの時で、なんで即値の格納場所が変わるんだろう。
immutableな変数とmutableな変数の比較
以下のコードも動かしてみた
fn main() {
let s = &1000u32;
let t = &1000u32;
println!("s :{}, {:p}, {:p}", *s, s, &s);
println!("t :{}, {:p}, {:p}\n", *t, t, &t);
let s = &1000u32;
let mut t = &1000u32;
println!("s :{}, {:p}, {:p}", *s, s, &s);
println!("t :{}, {:p}, {:p}\n", *t, t, &t);
let s = &1000u32;
let t = &mut 1000u32;
println!("s :{}, {:p}, {:p}", *s, s, &s);
println!("t :{}, {:p}, {:p}\n", *t, t, &t);
}
結果はこう。
s :1000, 0x558ff5a9fec0, 0x7ffe8895f048
t :1000, 0x558ff5a9fec0, 0x7ffe8895f050
s :1000, 0x558ff5a9fec0, 0x7ffe8895f188
t :1000, 0x558ff5a9fec0, 0x7ffe8895f190
s :1000, 0x558ff5a9fec0, 0x7ffe8895f2c8
t :1000, 0x7ffe8895f2dc, 0x7ffe8895f2d0
うーん、わからんけど、タイトルの知見を得た。
コード実行して適当に考えただけの仮説だけど、
- immutable即値は変更する必要もないのでReadOnlyなエリアに置く
- mutableな即値・変数は、変更可能なため、スタック領域に置く
- immutableな変数はドロップをしたいため、ReadOnlyなエリアには置かない
立ててみました。
これを立証するためのコード、もしくはドキュメントがあればいいんだけど...。
誰かご存知ないでしょうか。
超解説!!!!!!!!!
わかったら追記します。