スタックとヒープ
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); }