はじめに
Swiftではメモリ管理をしなくても、自動参照カウント ARC(Automatic Reference Counting)を使用して、アプリのメモリ使用状況を追跡および管理をしてくれているので、今までメモリ領域の認識をあまり持っていませんでした。
structとclassについて勉強している際、classは、メモリの「ヒープ領域」と呼ばれる場所に割り当てられ、structの場合は、「スタック領域」と呼ばれる場所に割り当てられる。
ヒープ領域・スタック領域はどちらもRAM上のどこかのセクションの一部に属する。
ヒープ領域・スタック領域って何という疑問が出てきたので調べてみました。
RAM・ROMについて何かわからないよって方は下記の記事を参考にしてみてください!
メモリの4領域
メモリは下記の4領域に分けられる。
テキスト領域(Program/Code)
機械語に翻訳されたプログラムが格納される。CPUの命令コードが格納されている領域。
この機械語の命令が 1 行づつ実行されることでプログラムが動く。
テキスト領域は読み出し専用なので、プログラム上でテキスト領域に書き込もうとすると割り込みが発生する。
ROM/RAM上であり、コンパイラがはきだす!変更しない領域が入る時はROM上で行われる。
静的領域(Static/Data)
プログラムの中で初期値をもつような変数に割り当てられる領域。
グローバル変数や静的変数(static 変数)が割り当てられる。
ROM/RAM上であり、コンパイラがはきだす!変更しない領域が入る時はROM上で行われる。
ヒープ領域
動的にメモリ領域の確保や解放を行うのがヒープ領域。Swiftの場合、classが割り当てられるのがヒープ領域。
動的にサイズが確保されるため、実行中にヒープ領域のサイズが変化する。
ヒープ領域のアドレスは先に確保したものから小さい順に割り当てられる。
RAM上であり、ランタイムで確保する!
スタック領域
関数内にあるローカル変数や、関数への引数、戻り値などに割り当てられるのがスタック領域。Swiftの場合、structが割り当てられるのがスタック領域で、ポインタで管理されている!メモリの示す先を必要なバイト数ずらしている。
スタック領域のアドレスは、先に確保したものから大きい順に割り当てられる。
RAM上であり、ランタイムで確保する!
スタック領域はコンパイラが最大何バイトか決めており、その領域をオーバーすると、スタック・オーバーフローが起こる!
メモリの4領域の関係を図にすると下の画像のようになります!
参考文献