スタックサイズの拡張
UNIX環境でのプログラムは初めてなんですが、スタックサイズに上限があるような気がします。数メガバイト級の構造体を戻り値としてガンガン使いたいのですが、強制終了されてしまいます。調べてみますと500KB付近に上限があるような感じです。設計上、特別な理由がない限りヒープ領域は使いたくありません。スタックを拡張するにはどうすればいいのでしょうか?どなたか親切な方がおられれば教えていただきたいのですが。
現在、Objective-C++を使用しております。
UNIX環境でのプログラムは初めてなんですが、スタックサイズに上限があるような気がします。数メガバイト級の構造体を戻り値としてガンガン使いたいのですが、強制終了されてしまいます。調べてみますと500KB付近に上限があるような感じです。設計上、特別な理由がない限りヒープ領域は使いたくありません。スタックを拡張するにはどうすればいいのでしょうか?どなたか親切な方がおられれば教えていただきたいのですが。
現在、Objective-C++を使用しております。
>スタックサイズに上限があるような気がします。
512kBです。limitコマンドで確認出来ます。
>設計上、特別な理由がない限りヒープ領域は使いたくありません。
ポインタ(とかオブジェクトの参照)のやり取りでは駄目なのでしょうか?
>スタックを拡張するにはどうすればいいのでしょうか?
limit stacksize ????k
setrlimit(2)
ありがとうございました。
てっきり、リンクパラメータで指定できるものと考えていたんですが、どうやら違うみたいですね。もしかしてスタックサイズは全アプリで共通の設定になるのでしょうか?
limitコマンドの有効範囲がいま一つ分からないんですが。。。
やはり、ヒープを使わなければならんのでしょうか?
こんなところで壁にぶちあたるとは。。。
もしかしてスタックサイズは全アプリで共通の設定になるのでしょうか?いいえ。
limitコマンドの有効範囲がいま一つ分からないんですが取敢えず limit は忘れて下さい。この話題には関係ありません。
man 2 setrlimitContent not available
スタック不足のせいで設計が歪むのは断じて許さん!!それはそうですが,
ローカル変数こそがプログラムの神髄である!! メモリリークをこの世から根絶せよ!!物にはそれぞれ用途があります。Local 変数は memory leak を避ける為にある訳ではありません。何でもかんでも local 変数にするのなら,そんな設計はそれこそ歪んでいます。64M もの stack を必要とする設計は大抵歪んでいるでしょうね。
どこかで(ML?) Mach の仕様的にスタックに壁があって無制限には広げられないって話を見た気がします。
まあ、BSD 側から見ると広げられてるかもしれませんが、単に互換になるように包んであるだけで Mach 的にはイケテない実装になってるかもしれません。
詳しくは Mach, BSD 関係の Developer 向け資料かなあ。
ま、情報までに。
# photoshop とかあらかじめどれだけのメモリ容量が必要な処理を行うかわからないようなアプリは困るような気がしないでもない。
# MacOS のときは OS 自体がプアで有りっ丈メモリ割り当て設定させる+自前でやってたみたいだけど...
おはようございます。いつのまにか、お返事ありがとうございます。
物理的な制約のみの理由でnewとdeleteを使いたくなかったんです。newとdeleteのペアがあわなくなりそうです。
自分のプログラムでも一週間ぶりに読むと、思い出せなくなります。ローカル変数のみの簡潔な構成の方が思い出せます。
メモリを大量に使うとすればほぼ例外なく複数の配列変数を含みます、配列変数の数だけnewとdeleteしていたら、思い出せなくなりそうです。
静的変数だと値の初期化と更新を分けなくてはいけませんが、ローカル変数だとそれを分ける必要がありません。C++だと全部初期化のみで行える場合が多いです。(反復と分岐があると無理ですが)
基本的に、同じ変数に値を何度も書き込んでいるとプログラムが見にくくなります。一つの変数に対して代入は一か所が原則です。例外が静的変数と外部変数ですが、使うとすれば状態遷移ぐらいです。考え方が状態遷移でもないのにそのような使い方をするとプログラムが難解に見えてしまいます。
せっかく仮想メモリがたくさんあるのだから、あるだけスタックをつかえばいいんです。そのほうが思い出せます。
せっかく仮想メモリがたくさんあるのだから、あるだけスタックをつかえばいいんです。そのほうが思い出せます。勿論使う使わないは個人の自由ですから止めはしませんが……
インチキちゃあインチキだなあ :)
メモリ欲しいぜって要求したら実際割り当てられるかどうかは別に値が返って来ますからねえ。実際使おうとしたら割り当てできなくて使えなくてエラーになって終了しちゃってるってのを結構見かけますからねえ。
まあ実メモリを増やすことで対処するのが真っ当でしょうね。仮想記憶は保険のようなものかな。
# Mac OS X の swap ってあんまし役にたたない気がする... Solaris とか FreeBSD だと swap の使用量が巨大になってもごりごりと低速(まあキー入力すらすごく待たされる状態になりますが)でなんとか動いたりしますが、Mac OS X って待ってても全然反応無くてお亡くなりになってることが多いような。
スタックサイズの拡張