ページ 1 / 1
メモリ領域について
Posted: 2012年6月04日(月) 22:31
by pblc
main関数のみのあるプログラムで二次元配列の要素数を500から1000にした所、セグメンテーション違反が起こったので
配列の宣言をstaticにしたら正しくコンパイルされたのですが、いまいち正しくコンパイルされた理由がわかりません。
静的変数はメモリを最後まで確保するのでむしろ自動変数より余計にメモリを食うと思うのですが…
それともスタック領域より静的領域のほうがメモリのサイズが大きいということでしょうか?
ちなみに処理系はgccです。
Re: メモリ領域について
Posted: 2012年6月04日(月) 22:44
by beatle
pblc さんが書きました:静的変数はメモリを最後まで確保するのでむしろ自動変数より余計にメモリを食うと思うのですが…
それともスタック領域より静的領域のほうがメモリのサイズが大きいということでしょうか?
静的領域は実行可能ファイルをメモリにロードする段階でサイズがはっきり分かりますから、それにあわせて領域が確保されます。
したがって、基本的にいくらでも静的領域に変数を確保することができます。
対照的に、スタック領域はメモリへのロード段階でははっきりした使用量が分かりません。動的に使用量が変化するからです。
ですから、通常はリンク時に決め打ちした容量でスタック領域が確保されます。
実行時にその領域を飛び出すくらい多く変数を確保するとだめになります。
Re: メモリ領域について
Posted: 2012年6月05日(火) 00:17
by softya(ソフト屋)
補足的に書くとWindows/Linux/MacなどのOSの場合の話はサイズだけですが、マイコンなどの場合はリンク時に明示的にスタックで使用するメモリの場所やサイズを決めてやる必要がある上にかなり小さくなることが多いです。
それとスタックは再帰呼び出しが深くなる毎に消費するので、再帰呼び出し関数内のローカル変数は大きものはほぼ取れません。
Re: メモリ領域について
Posted: 2012年6月05日(火) 00:43
by pblc
なるほど…。変数が動的か静的かぐらいの違いかと思っていたけれど、
やっぱりそれに合わせてメモリの確保の仕方も変わってくるんですね。
お二方ありがとうございました。