Rustコトハジメ

プログラミング言語Rustに関する情報をお届けします。

変数がスタック上でどのように配置されているか実験して調べる

Rustでは、

  • Vecはデータをヒープに持ち、それへの所有権を持つ変数(ポインタ、キャパシティ、長さの3つの要素を持つ)がスタック上に配置される
  • スライスはファットポインタ(ポインタと長さの2つの要素を持つ)で管理され、変数はスタック上に配置される

そして、変数がスタックから破棄される時に所有しているデータを破棄するという考え(RAII)を言語レベルで強制しています。

ここまでは、本にも載ってることなのですが、ではスライスのポインタはどうなるんだ?と疑問に思った時に、本に載ってなかったので調べてみました。

fn main() {
    let v: Vec<i32> = vec![1,2,3,4,5,6,7,8,9,10];
    let vv: &[i32] = &v;
    let vvv: &&[i32] = &vv;
  
    println!("{:p}, {}", &v, mem::size_of::<Vec<i32>>());
    println!("{:p}, {}", &vv, mem::size_of::<&[i32]>());
    println!("{:p}, {}", &vvv, mem::size_of::<&&[i32]>());
}

出力は以下です。

0x7ffcf237a7f8, 24
0x7ffcf237a7e8, 16
0x7ffcf237a7e0, 8

これはどういうことかというと、

f:id:akiradeveloper529:20181222144557j:plain

と配置されているということだと理解した。