メモリ割り当てについて

メモリ割り当てとは

メモリ上の領域を確保して、変数やデータ構造、クラスのインスタンス等をその領域に保存すること。

静的メモリ割り当て(static memory allocation)

プログラムが実行される前のコンパイル時に行われる。割り当てられるサイズは固定されており、プログラムの開始から終了まで存在する。

メリットとしては、メモリの開放を自動で行ってくれるので気にしなくて良い。逆にデメリットとしてはサイズの拡張ができない、余った時に無駄になること等があげられる。

#include <iostream>
using namespace std;

// グローバル変数
double pi = 3.14159265;

int main() {
    cout << pi << endl;
}

スタックメモリ割り当て(stack memory allocation)

コールスタック内に新しいスタックが作成される度に実行される。

コールスタック: サブルーチン(関数)に関する情報を一時的に保存する場所。

サブルーチンが呼び出されると、新しいスコープがスタックにプッシュされ、変数はそのデータをこの空間に格納する。
そのため、このスコープをポップすると、全ての変数とそのデータは消去される。これは変数が格納されたメモリ上のスタック領域が空になってアクセスできなくなるから。( = スコープに紐付けられた変数も消滅する)

このように変数の有効期限を制御することができないので、自動メモリ割り当て(automatic memory allocation)とも呼ばれる。

using namespace std;

double getPi(){
    // ローカル変数
    double pi = 3.14159;
    // getPi()がスタックからポップされると、変数 pi は消滅!!
    return pi;
}

int main() {

    // 関数は呼び出されると、OSによって関数自身に関する情報をコールスタックと呼ばれる領域に一時的に格納する
    cout << getPi() << endl;
}

動的メモリ割り当て(dynamic memory allocation)

ヒープメモリ割り当てとも呼ばれる。

ヒープメモリ: スタックメモリと違い、ユーザーがいつでも割り当てる事のできるメモリ。

メモリを割り当てるためにnew, mallocなどのキーワードや関数が使用されるみたい。 c++ は new ?..

新しいメモリを割り当てる場合、OSはメモリ内の空き領域を探し、そのメモリアドレスを取得する。また、ヒープメモリはスタックメモリとは完全に分離されているので、関数がスタックからポップされてもメモリアドレスとその内容が空になることはない!!

ヒープメモリはメモリの割り当てをユーザーが行える反面、削除もユーザーが行わなければならない(c++ は deleleを使用)。 削除し忘れてメモリが二度と使われない状態をメモリリーク(memory leak)と呼ぶ。メモリリークはメモリの性能低下の原因となるので注意が必要。

ガベージコレクタ(garbage collector)

使用されなくったメモリをヒープメモリから自動的に削除する処理のこと。最近の言語のほとんどで採用されている。