LoginSignup
7
1

More than 5 years have passed since last update.

immutableな即値のリファレンスは再利用されるけどmutableな即値のリファレンスは再利用されずに新しく作られるし、immutableな即値のリファレンスの格納場所は遠いという知見を得た。

Last updated at Posted at 2018-11-22

メモ書きです。
もうちょっと詳しく調べたいため、書き残しておきます(こうやって公開しておけば、サボらずに調べるでしょきっと!)。
何か知ってたり、指摘がある場合はコメントしてください。嬉しいです。

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

あー、ふーん...(わからん)。
なるほど...?つまりこういう事か?

memory.png

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なエリアには置かない

立ててみました。
これを立証するためのコード、もしくはドキュメントがあればいいんだけど...。
誰かご存知ないでしょうか。

超解説!!!!!!!!!

わかったら追記します。

7
1
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1