スタックとヒープ

Rustでは、メモリ管理が非常に重要であり、スタックとヒープという2つの主要なメモリ領域を使用します。

スタック

  • 特徴: スタックはLIFO(Last In, First Out)のデータ構造で、関数の呼び出し時に使用されます。関数の引数やローカル変数がスタックに積まれ(push)、関数の終了時にスタックから取り除かれます(pop)。
  • 利点: スタックはデータの取り扱いが高速で、メモリの確保と解放が自動的に行われます。データのサイズが固定されているため、効率的です。
  • 制約: スタックはサイズが固定されており、動的なメモリ確保ができません。大きなデータや長期間保持するデータには向いていません。

コンパイル時にサイズがわからなかったり、サイズが可変のデータはヒープに格納することができます。

ヒープ

  • 特徴: ヒープは動的にメモリを確保するための領域で、データのサイズが可変です。実行時に必要なメモリを確保し、使用後に解放します。
  • 利点: ヒープは動的なメモリ管理が可能で、大きなデータや長期間保持するデータに適しています。サイズが事前にわからないデータにも対応できます。
  • 制約: ヒープはメモリの確保と解放が手動で行われるため、スタックよりも遅くなります。また、メモリリークや断片化のリスクがあります。
fn main() {
    // スタック上に確保される変数
    let x = 5;
    // ヒープ上に確保されるString型
    let mut s = String::from("Hello");
    s.push_str(", world!");
    println!("{}", s);
}