ヒープ領域とスタック領域

ヒープとスタックの違いを解説 | プログライフ

ヒープ(heap)領域もスタック(stack)領域もメモリ領域の呼び方です。

スタック領域

char str[256];
int i;
float f;

このように記述するとスタック領域に、256byte、4byte、4byteと積まれていきます。

スタック領域に積まれた変数は、OSが自動的に必要な時に確保して、使用しなくなったら開放してくれます。

スタックはプログラムをコンパイルする時点でサイズが決まるため、動的に使用したいサイズが変わるときには想定できる最大サイズを確保しておく必要があります。これではメモリの無駄遣いになるため、ヒープというものが出てきます。

ヒープ領域

ヒープ領域はアプリケーションが動的に確保する領域です。C言語においては一般的にmalloc関数で確保します。

char *data;
int size = 256;
data = malloc(size);
free(date);

このように記述するとヒープ領域が256byte確保でき、確保した領域の先頭アドレスがdataに格納されます。free関数で確保したヒープ領域が解放されます。

動的にメモリを確保できるので、例えばファイルサイズみたいなものは size に動的にその値を指定してやれば効率的にメモリを確保できる。

ヒープを使用するときの注意点

  • mallocでヒープ領域を確保した時は、かならずfreeで開放しましょう。解放ぜずにmallocし続けるとメモリリークとなります。
  • ヒープの確保・解放を繰り返すとメモリが断片化(フラグメンテーション)され、使用できないメモリが増えていきます。ヒープの確保・解放は最小限にしましょう。

「GB」と「GiB」の違い

  • GB: 「ギガバイト」の省略表現。10億(10の9乗)バイトを表す単位
  • GiB: 「ギビバイト」の省略表現。2の30乗バイトを表す単位

「キロバイト」「メガバイト」「ギガバイト」と言えば「あぁ、1,000倍なのね」と分かるし「キビバイト」「メビバイト」「ギビバイト」と言えば「あぁ、1,024倍なのね」と分かる

10進数の世界がGB, 2進数の世界がGiBという使い分け。