回答編集履歴

1 typo

Chironian

Chironian score 22930

2016/06/18 13:41  投稿

こんにちは。
スタック・サイズを指定するケースは少なくないと思います。
[VC++も最大スタック・サイズの指定](https://msdn.microsoft.com/ja-jp/library/tdkhxaks.aspx)があります。
一般にスタックは連続したアドレス空間を必要とします。[MMU](https://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%A2%E3%83%AA%E7%AE%A1%E7%90%86%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88)搭載システムでもアドレス空間の空きは必要ですし、組み込み系マイコンの場合MMUが搭載されていないケースも少なくなく連続した物理メモリが必要です。
一般にスタックは連続したアドレス空間を必要とします。[MMU](https://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%A2%E3%83%AA%E7%AE%A1%E7%90%86%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88)搭載システムでもアドレス空間の空きは必要ですし、組み込み系マイコンの場合、MMUが搭載されていないケースも少なくなく、そのようなシステムではスタック用に連続した物理メモリが必要です。
そのため、MMU搭載システムでは最大スタック・サイズ、非MMU搭載システムではスタック・サイズの指定は事実上必須です。(指定しない場合はデフォルト値が決められていると思います。)
スタック領域を超えた場合に何が起こるのか、システムにより異なります。MMUが搭載されていないような組み込みマイコンの場合は、スタック領域を越えてメモリへ書き込みが発生し、メモリ破壊になるケースが多いと思います。これは致命的なバグとなります。
そのため、非MMU搭載システムでは、実際に使用するスタックのサイズを見積もり、それに少し余裕をもってスタック領域を確保します。複雑なプログラムの場合、なかなかたいへんです。
極小規模なマイコン(RAMが数100Bytesみたいな)では、全てのコール・シーケンスを辿ってスタック・サイズを見積もってました。8bitマイコンでC言語を使うようなケースでは無理でしたので、スタック領域を特定の値で埋めておいて、一通りの機能を実行後に消費したスタック量を確認してました。後者は完全に行うことは無理なので、再帰呼び出しは不可とする、割り込みは別スタックへ切り替える等の工夫を行ってました。そして、若干の余裕を確保してスタック・サイズを定めるということを行います。
つまり、非MMU搭載システムでは、スタック・サイズを指定できないとメモリ破壊バグを回避する術がないと思います。
> 仮に、指定したスタックサイズを超えたとき、静的、動的メモリがスタック
サイズに達していなければ問題ないと思っているのですが、違うのでしょう
か?
静的メモリはデータ領域(リンカにて割り当てられる)、動的メモリはmalloc等でヒープから確保します。
スタック上に確保するメモリはローカル変数やバラメータ、戻り番地等です。動的か静的かで分類すると動的メモリに当たるでしょう。
「指定したスタックサイズを超えたとき」は、動的メモリがスタック・サイズを超えているということです。その時、致命的な不具合が顕在化することが多いです。
恐怖のスタックオーバーフローです。
---
【余談ですが】
有名なQAサイトの[Stack Overflow](http://stackoverflow.com/)はその究極の恐怖に対処したいぞ、のような意味を込めているかも?

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る