🦉

コンパイルするときに割り当てられるメモリの領域と役割について

に公開

あんまり意識しないけど、原理的な仕組みへの理解としてぼんやり覚えておくための記録です。

割り当て領域の種類とそれに付随する情報

領域 対象 説明
静的メモリ グローバル変数とか プログラムの実行中ずっと保持される
スタック ローカル関数 メソッド終了時に解放される
ヒープ (動的メモリ) newやmallocなどで動的に割り当てをした関数 ガベージコレクションによって削除されるか、メモリに残り続ける

実際のコード上での事例

class Program
{
    // 静的メモリ領域(静的変数)
    static int staticValue = 100;

    static void Main(string[] args)
    {
        // スタック領域(値型のローカル変数)
        int stackValue = 42;

        // ヒープ領域(参照型のインスタンス)Personオブジェクト(Alice,30を含む)がヒープに存在するようになる
        Person person = new Person("Alice", 30);

        Console.WriteLine("Static Value: " + staticValue);
        Console.WriteLine("Stack Value: " + stackValue);
        Console.WriteLine("Person Name (Heap): " + person.Name);
    }
}

class Person
{
    public string Name;
    public int Age;

    public Person(string name, int age)
    {
        Name = name;  // ヒープに格納されるフィールド
        Age = age;    // ヒープに格納されるフィールド
    }
}

まとめとか

グローバル変数は静的メモリ、ローカル変数はスタック、インスタンスとかはヒープに保存されて使われますよ。という内容でした。
グローバル変数はスパゲッティコードやバグの温床になりやすいため、設計次第では不要にするのが主流ですね。オブジェクト指向設計とかはこれにあたります。
目に見えないからややこしいですよね。明日には忘れていそうです。

Discussion