Rust Boxの整理

Rustを身につけたく色々記事を覗きながら書く練習を進めているが忘れるのでここに残す。 今回は、Boxについて書く。

まずは、コンピュータのメモリに関して復習から始める。 OSが管理するメモリ領域は、いくつかあるがその中でアプリケーションが利用可能なメモリ領域で「スタック」「ヒープ」がある。 スタックは、コンパイラやOSが自動的に割り当て、開放が行われる領域である。サイズは、コンパイル、リンクする際に決められる。 Rustは、デフォルトではすべての値がスタックに割当てられます。

もう一方のヒープに関しては、アプリケーションがメモリが必要になった際に確保するためのメモリ領域として利用される。 C言語ではmalloc関数を用いて一定サイズの領域を確保する。 今回のRustではBoxと呼ばれる標準ライブラリを用いてメモリ領域の確保を行う。 以下のRust by Exampleを元にまずは、簡単なコードを作る。

struct Point {
    x: f64,
    y: f64,
}

fn boxed_origin() -> Box<Point> {
    Box::new(Point {x:0.0,y:0.0})
}


fn main() {
    let boxed_point: Box<Point> = boxed_origin();
    println!("{}",boxed_point.x);
    println!("{}",boxed_point.y);
}

上記では boxed_origin関数で座標を表すPointという構造体の座標(0.0,0.0)のデータを持つデータ領域をBoxを用いて一つ確保し、 そのデータをメイン関数側でBox型の変数を作り受け渡しを行っている。 二段階にポインタを挟むと以下の様になる。 struct Point { x: f64, y: f64, }

fn boxed_origin() -> Box { Box::new(Point {x:0.0,y:0.0}) }

fn main() { let box_in_a_box: Box<Box> = Box::new(boxed_origin()); println!("{}",box_in_a_box.x); println!("{}",box_in_a_box.y);

}