プログラミング言語のメモリ管理について
最近勉強したプログラミング言語のメモリ管理について紹介する。
参考にした本*1
そもそもなぜメモリ管理が必要なのか
- 不要なメモリ領域を開放する。必要な時にメモリ領域を割り当てることをメモリ管理と呼ぶ
- 不要なメモリが開放されないと、例えばwebサーバーのような長期間動くプロセスでは、利用するメモリがどんどん増えていき、コンピュータ自身の動作を不安定にする。メモリリークと呼ばれる
- 必要なメモリ領域が確保されていない(例えば、開放された後に参照してしまう)と、何が起こるかわからない状態になる。エラーで落ちてくれるかもしれないし、アクセス許可をしていない値にアクセスしてしまうかも知れない。
代表的なメモリ管理方法とその詳細
- 静的変数
- プログラムを開始する前に必要なメモリ領域をすべて決めてしまう。
- すべての変数がプログラムの開始から終了まで生存する
- メリット
- すべての変数のメモリが確保されており、開放されることもないのでメモリ管理の最低限の目的が達成される
- デメリット
- プログラム起動後にメモリ容量を変えることができない
- 自動変数
- 変数にスコープを設定して、それに従いメモリ領域を開放する
- メリット
- 自動で開放されるので、メモリリークの心配がない
- デメリット
- 開放された後のメモリ領域にアクセスしてしまうことが在る
- メリット
- 変数にスコープを設定して、それに従いメモリ領域を開放する
- メモリの手動確保、開放
- C,C++
- プログラム作成者が任意のタイミングでメモリの確保、開放を行う
- メリット
- メモリの確保、開放のタイミング、その大きさを自由に決めることができる
- デメリット
- 管理が複雑。間違って2回開放してしまった場合などにプログラムをクラッシュさせてしまう。
- ヒープを使うので、実行コスト大きい
- スマートポインタ
- ガベージコレクション
- Rustのメモリ管理
まとめ
色々なメモリ管理方法があるが、システムプログラムをかくならRustの方が他の言語よりもメンテナンス性、パフォーマンスの面で1段階上にいるとおもう。
*1:Software Design 2021年9月号