スタックサイズの拡張

 UNIX環境でのプログラムは初めてなんですが、スタックサイズに上限があるような気がします。数メガバイト級の構造体を戻り値としてガンガン使いたいのですが、強制終了されてしまいます。調べてみますと500KB付近に上限があるような感じです。設計上、特別な理由がない限りヒープ領域は使いたくありません。スタックを拡張するにはどうすればいいのでしょうか?どなたか親切な方がおられれば教えていただきたいのですが。
 現在、Objective-C++を使用しております。

投稿日 2001/12/02 11:49

返信: 10

2001/12/02 12:56 Community User への返信

>スタックサイズに上限があるような気がします。
512kBです。limitコマンドで確認出来ます。
>設計上、特別な理由がない限りヒープ領域は使いたくありません。
ポインタ(とかオブジェクトの参照)のやり取りでは駄目なのでしょうか?
>スタックを拡張するにはどうすればいいのでしょうか?
 
limit stacksize ????k

2001/12/02 16:36 Community User への返信

 ありがとうございました。
てっきり、リンクパラメータで指定できるものと考えていたんですが、どうやら違うみたいですね。もしかしてスタックサイズは全アプリで共通の設定になるのでしょうか?
 limitコマンドの有効範囲がいま一つ分からないんですが。。。
 やはり、ヒープを使わなければならんのでしょうか?
 こんなところで壁にぶちあたるとは。。。

2001/12/02 18:54 Community User への返信

もしかしてスタックサイズは全アプリで共通の設定になるのでしょうか?
いいえ。

limitコマンドの有効範囲がいま一つ分からないんですが
取敢えず limit は忘れて下さい。この話題には関係ありません。

man 2 setrlimit


と Terminal で打って,setrlimit 関数の使い方を調べて下さい。お望みの事が出来ます。

2001/12/08 17:52 Community User への返信

スタック不足のせいで設計が歪むのは断じて許さん!!
それはそうですが,

ローカル変数こそがプログラムの神髄である!! メモリリークをこの世から根絶せよ!!
物にはそれぞれ用途があります。Local 変数は memory leak を避ける為にある訳ではありません。何でもかんでも local 変数にするのなら,そんな設計はそれこそ歪んでいます。64M もの stack を必要とする設計は大抵歪んでいるでしょうね。

Memory leak を避けたいのならまともな garbage collector をそなえた言語,例えば Ruby の様な物の採用を考えた方がいいでしょう。

2001/12/11 18:32 Community User への返信

どこかで(ML?) Mach の仕様的にスタックに壁があって無制限には広げられないって話を見た気がします。
まあ、BSD 側から見ると広げられてるかもしれませんが、単に互換になるように包んであるだけで Mach 的にはイケテない実装になってるかもしれません。
詳しくは Mach, BSD 関係の Developer 向け資料かなあ。
ま、情報までに。
# photoshop とかあらかじめどれだけのメモリ容量が必要な処理を行うかわからないようなアプリは困るような気がしないでもない。
# MacOS のときは OS 自体がプアで有りっ丈メモリ割り当て設定させる+自前でやってたみたいだけど...

2001/12/31 05:01 Community User への返信

 おはようございます。いつのまにか、お返事ありがとうございます。
 物理的な制約のみの理由でnewとdeleteを使いたくなかったんです。newとdeleteのペアがあわなくなりそうです。
 自分のプログラムでも一週間ぶりに読むと、思い出せなくなります。ローカル変数のみの簡潔な構成の方が思い出せます。
 メモリを大量に使うとすればほぼ例外なく複数の配列変数を含みます、配列変数の数だけnewとdeleteしていたら、思い出せなくなりそうです。
 静的変数だと値の初期化と更新を分けなくてはいけませんが、ローカル変数だとそれを分ける必要がありません。C++だと全部初期化のみで行える場合が多いです。(反復と分岐があると無理ですが)
 基本的に、同じ変数に値を何度も書き込んでいるとプログラムが見にくくなります。一つの変数に対して代入は一か所が原則です。例外が静的変数と外部変数ですが、使うとすれば状態遷移ぐらいです。考え方が状態遷移でもないのにそのような使い方をするとプログラムが難解に見えてしまいます。
 せっかく仮想メモリがたくさんあるのだから、あるだけスタックをつかえばいいんです。そのほうが思い出せます。

2001/12/31 08:39 Community User への返信

せっかく仮想メモリがたくさんあるのだから、あるだけスタックをつかえばいいんです。そのほうが思い出せます。
勿論使う使わないは個人の自由ですから止めはしませんが……

但し仮想記憶なんていうのは無い物をある様に見せ掛けるインチキな機構であって,動き出せば機械の本来の性能は出なくなりますし,stack への data の積み卸しだって只じゃない事は忘れずにいるべきでしょう。

しかし書かれている事を読む限り,益々 Ruby を薦めたくなりますね。やってみませんか,Ruby?

<http://www.ruby-lang.org/>

2002/01/01 06:27 Community User への返信

インチキちゃあインチキだなあ :)
メモリ欲しいぜって要求したら実際割り当てられるかどうかは別に値が返って来ますからねえ。実際使おうとしたら割り当てできなくて使えなくてエラーになって終了しちゃってるってのを結構見かけますからねえ。
まあ実メモリを増やすことで対処するのが真っ当でしょうね。仮想記憶は保険のようなものかな。
# Mac OS X の swap ってあんまし役にたたない気がする... Solaris とか FreeBSD だと swap の使用量が巨大になってもごりごりと低速(まあキー入力すらすごく待たされる状態になりますが)でなんとか動いたりしますが、Mac OS X って待ってても全然反応無くてお亡くなりになってることが多いような。

このスレッドはシステム、またはAppleコミュニティチームによってロックされました。 問題解決の参考になる情報であれば、どの投稿にでも投票いただけます。またコミュニティで他の回答を検索することもできます。

スタックサイズの拡張

Apple サポートコミュニティへようこそ
Apple ユーザ同士でお使いの製品について助け合うフォーラムです。Apple Account を使ってご参加ください。