メモリ管理
- メモリとはCPUが処理を行う際に読み書きを行うデータを格納する領域。
- Rustはを採用していない
→プログラマがメモリ管理をコントロールすることができる
→低レベルソフトウェアを開発できる(OSなど)
ガベージコレクション
- ガベージコレクションとはメモリの解放を自動で行ってくれる機能
- GC(ガベージコレクション)が使用されている言語とされていない言語がある
所有権・借用権・ライフタイム
- Rustではガベージコレクション(GC)を使用せずにメモリ安全性を確保するために所有権と借用とライフタイムの仕様を採用している
【所有権】
- 所有権:変数の中身を所有する権利
- Rustの所有権(ownership)は、値の所有者をただ一つに限定し、その所有者が値の破棄処理を行う責任を持つという規則である。
- 変数を代入すると、Rustは変数の所有権ごと渡す
let a = 'hello'
let b = a
/**
エラー
変数aの所有権はbに移動(ムーブ)される→aはもう参照できないためエラー
**/
参考動画
【借用】
-
借用とは所有権を移さないで、変数の中身を一定期間レンタルできること
-
Rustの変数には2種類ある
- イミュータブル:データを作成したら変更ができない
- ミュータブル:データを作成しても変更ができる
-
それぞれの借用の方法
イミュータブルな借用
let a = 'hello' let b = &a エラー起きない 所有権をaに残したまま
ミュータブルな借用
let mut x = vec![1, 2, 3] let y = &mut x let z = &mut x エラー ミュータブルな変数の借用は複数できない
-
借用の注意点
ミュータブルな借用とイミュータブルの借用は同時にできない
let mut x = vec[1, 2, 3] let y = &mut x let z = &x エラー xは可変として借用されているため、不変として借りることができません
参考動画
【ライフタイム】
- ライフタイム:借用において、所有者のスコープより長く存続できない
let a
{
let b = 1
let a = &b
}
println!{a}
エラー
bはスコープを抜けた時点でメモリを解放する
→aはメモリ解放後のリソースを参照してしまうことになるため
参考動画
【Rustについての参考動画】