cloneのパラメータでスタックのアドレスを渡しますがその際のスタック管理で良い方法はないでしょうか?
条件:
1.cloneで生成されるスレッドは多数存在する。
2.各スレッドは不定期に消滅する。
3.他のスレッドからも消滅させられる。

現在以下の2つのパターンで検討していますが、他に良い方法はないでしょうか?
1.生成される度にmalloc()でスレッド用のスタックエリアを確保し、そのアドレスをcloneのパラメータとして渡す。消滅時にそのパラメータを使用しfree()で解放する。(但し、他のスレッドから消滅させられる場合にスタックのアドレスが分からない。)
2.生成されると思われる個数分のスタックエリアをcalloc()で確保し、そのインデックス値をcloneのパラメータとして渡す。消滅時にそのパラメータを使用しスタックエリアをクリアし次にcloneで生成されるスレッド用として使用する。(但し、他のスレッドから消滅させられる場合にスタックのインデックス値が分からない。)


pthread_create()の場合、スタックの管理はどうなっているのでしょうか?



Linuxでのスレッドについて詳しいHP、参考書等知っていれば教えて下さい。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

ちょっと探してみたのですが、時間がなくてLinuxのpthreadライブラリの


ソースは見つけられなかったです。。。
探して見てみるのが一番です。

多分、pthread側ではあまり考えずに、mmapかなにかでメモリ割り当て
していると思います。。。
ちゃんとしたPOSIXスレッドなら、スレッドそのものが使いまわされる
ので、いちいちpthread_createで毎回スレッドが作られるわけじゃ
ないですしね。
つまり、スタックの割り当て・解放もそう頻繁には起きないです。


以下は、ご参考レベルで私の意見を述べます。
試してみていないので、ほんとにご参考・ヒントのレベルです。。。。

cloneプロセスが外部から終了させられる、、というのは、
シグナル等の非同期な手段で終了させているのでしょうか?
そうであるなら、SIGHUPかなにかで終了させるようにし、
シグナルを受けた終了すべきプロセスでは、すぐに終了せずに、
シグナルハンドラへ飛んでから自分でスタックを開放してから終了する、、
あるいは、「終了したよ」という印を共有メモリに書きこんで
それを監視するプロセスにより、メモリ解放・再割り当てを
行うようにしてはどうでしょうか?

例えば、
使用中/未使用のフラグ、
cloneプロセスの状態(生きてるよ、終了したよ)などのフラグや、
そのcloneプロセスが使用するスタックのアドレスなどを
格納する構造体を作成し、それを、cloneプロセスの
最大数分の配列にし、独自のcloneプロセス管理テーブルとする。

cloneでプロセスを作成して関数コールをする際に、引数を
渡せますが、そこのなかに自分で管理した未使用のIDを付与するようにして、
cloneされたプロセスは、そのIDをキーにして、管理テーブルを
参照更新するようにする。。。

cloneプロセス作成前に、割り当てられたIDから管理テーブルを
見つけ、スタックのアドレスが入っていなければ、mallocをして
そこにアドレスを入れ、アドレスが入っていれば、それをそのまま使い、
使用中フラグをたててから、cloneする。cloneプロセスにはそのIDを渡す。。。

mallocに失敗したら、未使用テーブルのスタックを解放して
メモリを確保する、あるいは定期的にテーブルを走査して
未使用のスタックを解放する、、などの方法もありますね。。。


ところで、pthread使うのはヤなんですか?
    • good
    • 0
この回答へのお礼

ありがとうございました。
アドバイスのようにアドレス管理テーブルを持って対処する方法でいきます。

pthreadを使うのはイヤでは無いのですが、
詳しい使用方法が載っている参考書等が手元になくcloneを先に検討しました。。

pthreadの使い方が分かりやすく載っている参考書、HPなどが有れば教えていただきたいです。お願いします。

お礼日時:2001/03/05 10:38

たまたまみつけたのですが、下に紹介しますIBMのページの日本語記事一覧の中に


「POSIXスレッドの説明」というのが第3回まで連載しているようです。。。

ちらっと見ただけですが、けっこう詳しく書いてますね。
この中で、書籍等の説明もしているようです。

参考URL:http://www-6.ibm.com/jp/developerworks/linux/lib …
    • good
    • 0
この回答へのお礼

ありがとうございます。
参考にし勉強します。
分からないことが有ったら、またアドバイスお願いします。。

お礼日時:2001/03/06 21:08

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QJSP/サーブレットって言語なんですか?

一言なんですが、
JSP/サーブレットって言語なんですか?

Aベストアンサー

---Insider's Computer Dictionaryより引用----------
サーブレット:
Webサーバ上で実行される、Javaのプログラムモジュールのこと。Javaアプレットがクライアント側で実行されるのに対し、Javaサーブレットはサーバ側で実行されるという違いがある。Javaサーブレットと似た機能としてCGIというものもある。しかしCGIはWebブラウザからの要求に応じて、その都度起動され実行される独立したプログラムモジュールであるのに対し、Javaサーブレットは、Webサーバプロセス中のスレッドとして実現されている。そのため、サーブレット自身でステート(状態)を持った処理を行うことができるし、(いちいち外部プロセスを起動しないので)要求に対する応答も素早く、Javaなのでプラットフォームにも依存しない、という特徴がある。
---Insider's Computer Dictionaryより引用----------

JSPとは「Java Server Pages」の略で、HTMLの中に埋め込めるJavaというような感じです。
JSPは最初のリクエスト時にコンパイル(ページ・コンパイル)されて、サーバーにjavaファイルと(javaファイルをコンパイルした)クラスファイルが生成されます。
生成されたjavaファイルとクラスファイルが実はサーブレット(を継承したクラス)で、このサーブレットの中で最終的にブラウザで表示されるHTMLを返しています。

JSPはサーブレットなので、サーブレットできることはJSPでも出来ますが、現在はMVCモデルに沿ってデザインするのが主流です。
MVCモデルについて細かくは説明しませんが、MVCモデルでは
サーブレット:BeanやJSPをコントロールする
JSP:ブラウザに表示する部分を担当
というような感じです。

これから勉強するのであれば、
1.サーブレットがサーバーでどのように動いているか
をきちんと勉強し、
2.HTMLを返すだけのシンプルなサーブレット
3.JSP
4.サーブレットとJSPの連携
5.Strutsなどのフレームワークの使用
とステップアップしていくのがいいと思います。

---Insider's Computer Dictionaryより引用----------
サーブレット:
Webサーバ上で実行される、Javaのプログラムモジュールのこと。Javaアプレットがクライアント側で実行されるのに対し、Javaサーブレットはサーバ側で実行されるという違いがある。Javaサーブレットと似た機能としてCGIというものもある。しかしCGIはWebブラウザからの要求に応じて、その都度起動され実行される独立したプログラムモジュールであるのに対し、Javaサーブレットは、Webサーバプロセス中のスレッドとして実現されている。そのた...続きを読む

QスレッドAで信号を送り、返答があったときにスレッドBを起動、スレッドAの信号のデータを初期化する方法

VC6.0で開発しています。
今、次のような処理をどうすればよいか悩んでいます。ヒントになる回答を頂けたら幸いです。

データをやり取りする際、どのような処理を行うか命令するもの(以下、命令A)と、命令された通りのデータを送るもの(以下、送信B)、そして、AとBの通信部分を担うもの(以下、通信C)があります。

データのやりとりは、マルチスレッドで行っています。
データをやりとりするために、スレッドが通信C上で2つ起動しています。1つ目のスレッド(以下、スレッドA)は、送信Bが命令Aから送られる特定のデータ(以下、データA)を受け取れるかをどうかの信号を、命令Aに送るためのものです。2つ目のスレッド(以下、スレッドB)は、データAを通信Cが受け取り、送信Bに渡すときに起動するスレッドです。

スレッドAで、送信Bから命令Aへ、受信の準備ができたことを伝える信号が送られます。その後、命令AよりデータAが送られ、通信CでスレッドBが起動するのですが、データAを通信Cで受信したとき、スレッドAで送っている信号を初期化しなければいけません。

データAを受信したときにはスレッドBが起動しますので、スレッドAとスレッドBの間での処理ということになります。

スレッド処理について、まだまだ不勉強なのですが、よいアイディアがあれば教えてください。
よろしくお願いします。

VC6.0で開発しています。
今、次のような処理をどうすればよいか悩んでいます。ヒントになる回答を頂けたら幸いです。

データをやり取りする際、どのような処理を行うか命令するもの(以下、命令A)と、命令された通りのデータを送るもの(以下、送信B)、そして、AとBの通信部分を担うもの(以下、通信C)があります。

データのやりとりは、マルチスレッドで行っています。
データをやりとりするために、スレッドが通信C上で2つ起動しています。1つ目のスレッド(以下、スレッドA)は、送信Bが...続きを読む

Aベストアンサー

アプリ毎に整理してみました。分からないところは想像で書いています。

--命令A--
(1)「命令A→通信C」のファイルを作成。「送信Bが送信Aに対して、データの要求をしているのかを判別するデータを送信しろ」を送る。
(2)「通信C→送信B、命令A」のファイルを監視。「命令Aにデータ要求」が書き込まれるの待つ。
(3)「命令A→通信C」のファイル2を作成。「送信Bの要求データ」を作成する。
(4)「通信C→送信B、命令A」のファイルを監視。「送信Bはデータの要求をしていない」に書き換わるの待つ。
(5)(1)に戻る。

--送信B--
(1)「通信C→送信B、命令A」のファイルを監視。「送信Bが命令Aに対して、データの要求があるか」が書き込まれるのを待つ。
(2)「送信B→通信C」のファイルを作成して、「送信Bが命令Aに対して、データの要求がある」を書き込む。
(3)「通信C→送信B」のファイルが作成されるのを待つ。
(4)ファイルを読んで、データを何らかの手段で送信。
(5)(1)に戻る。

--通信C--
(1)「命令A→通信C」のファイルが作成されるを待つ。
(2)スレッド1を起動する。
(3)「送信B→通信C」のファイルが作成されるのを待つ。
(4)スレッド1に(3)に進むよう指令を出す。
(5)「送信B→通信C」のファイルを削除する。
(6)「命令A→通信C」のファイル2が作成されたことを検出。
(7)スレッド2を起動する。
(8)このあと???

・スレッド1
(1)「通信C→送信B、命令A」のファイルを作成。「送信Bが命令Aに対して、データの要求があるか」を書き込む。
(2)何らかの指令があるまで(1)を繰り返す。
(3)「通信C→送信B、命令A」のファイルを書き換え。「命令Aにデータ要求」に書き換える。
(4)何らかの指令があるまで(3)を繰り返す。
(5)「通信C→送信B、命令A」のファイルを書き換え。「送信Bはデータの要求をしていない」に書き換える。
(6)「命令A→通信C」のファイルを削除する。
(7)スレッドを終了する。

・スレッド2
(1)スレッド1に対して、指令を送り(5)に移行するように促す。
(2)「命令A→通信C」のファイル2を読み込み、「通信C→送信B」のファイルを作成する。コピー後「命令A→通信C」のファイル2は削除する。
(3)スレッドを終了する。

勘違いがあったら訂正をお願いします。

全体として問題を感じたので何点か上げます。
・ファイル作成を条件に動いている所があるが、ファイル内容が全部書き出されていないうちに動き出してしまわないか?
・必要な動作に対してやっていることが複雑である。処理の起点はなぜ送信Bの要求から始まらないのか?命令Aから始まる理由は?
・ファイルの後始末が不明確。
・スレッド1の処理で、何度もファイルを書き換える理由は?
・命令Aと送信Bが通信していれば作れそうな気がする処理で、通信Cが必要な理由が分からない。


シンプルにするとしたら、こんな感じには出来ないのでしょうか?
一応命令Aを起点にしています。スレッドがなくなってしまうので、このアプリの構成がスレッドの勉強のためだったら申し訳ない!

--命令A--
(1)送信Bにメッセージで要求がないか問い合わせる。
(2)送信Bの返事を待つ。
(3)送信要求なら、ファイルを作成する。送信不要なら(1)に戻る。
(4)送信Bにメッセージでファイルが出来たことを知らせる。
(5)送信Bの返事を待つ。
(6)(1)に戻る。

--送信B--
(1)命令Aから要求の問い合わせを待つ。
(2)命令Aにメッセージで要求の有無を送信。
(3)要求無しなら(1)に戻る。
(4)命令Aからファイルの完成メッセージが届くのを待つ。
(5)ファイルを読んで何らかの方法で送信する。
(6)ファイルを削除する。
(7)命令Aにメッセージで送信が完了したことを知らせる。
(8)(1)に戻る。

相互の通信にはWindowsAPIのPostMessageを使用する予定です。
ただし、両方のアプリにhWndが必要なので両方ともウィンドアプリである必要があります。
http://yokohama.cool.ne.jp/chokuto/urawaza/api/PostMessage.html

アプリ毎に整理してみました。分からないところは想像で書いています。

--命令A--
(1)「命令A→通信C」のファイルを作成。「送信Bが送信Aに対して、データの要求をしているのかを判別するデータを送信しろ」を送る。
(2)「通信C→送信B、命令A」のファイルを監視。「命令Aにデータ要求」が書き込まれるの待つ。
(3)「命令A→通信C」のファイル2を作成。「送信Bの要求データ」を作成する。
(4)「通信C→送信B、命令A」のファイルを監視。「送信Bはデータの要求をしていない」に書き換わるの待...続きを読む

QJAVA言語,JSPによるクイズシステム(環境エクリプス5.5)(問題文はテキストで作成)

環境エクリプス5.5。JAVA言語を使いJSPでクイズプログラムを作ることになりました。流れは、いくつかの選択ボタンがあり、押したら問題が1問出て、4択式の中からクリック式で選び、正解だったら正解ページに行き、間違いだったら不正解ページに行きますが解説は正解も不正解も一緒です。その正解、不正解ページにある「次の問題」というボタンを押したら次の問題をだします。問題は10問です。MVCアーキテクチャーの概念にそって、サーブレット、モデル、ビューで作っていきます。問題をテキストにつくりたいのですが、先ほどの説明画面のようにするには、テキストでどのように作っておけばよいのか?わかりません。テキストはモデルクラスで呼ぶのですが、そのクラスでどのような定義をしたら呼べるのか?どのようにしあたら、問題、回答4つ、解説をわけることができるか?。お願いします。どなたか教えていただけませんか?できなくてとても困っています。

Aベストアンサー

RDBMSを利用可能なら、そちらの方がいいです。

利用不可でしたら、CSV(カンマ区切り)かTSV(TAB区切り)形式で十分でしょう。1行に1問を書き、左から、問題文、回答番号、回答1、回答2、回答3、回答4、の6カラムをカンマかTABで区切ります。

【例】
Javaの宿題ができない。どうする?,1,自力でやる,教えてgoo,Google,諦める
日本の首都は?,3,ニューヨーク,ロンドン,東京,モスクワ

Qスレッドを再生成する方法

VBからC言語DLLを呼ぶプログラムを作っています。
DLLでスレッドを生成しているのですが、
VBから1回目の呼び出しではうまく動作するのですが、2回目はスレッドが生成されません。
2回目は1回目のスレッドが終了してから呼び出しているのですがなにか処理が必要なのでしょうか?

スレッドは_beginthreadexで生成してスレッド関数内のreturnで終了しています。
closehandleを追加してみましたが駄目でした。

Aベストアンサー

>closehandleを追加してみましたが駄目でした。
これは新規スレッド作成になんの影響もありません。

>なにか処理が必要なのでしょうか?
特別な処理は必要ありません
基本的にスレッドは。(スタックが確保できる限り)
同時に何個でも起動させる事が可能です。
スレッドが終了したかどうかはハンドルがシグナル状態かどうかで判断できます。

>2回目は1回目のスレッドが終了してから呼び出しているのですが
このあたりにバグがあるのだと思います。

Qホームページを作成する際に良い言語

以前JSPで作っていたのですが、PHPとかでもいいのかとおも思っています。
データベースなどが必要なサイトで皆さんならどの言語がいいですか?私はプログラマーではないのでいいなりなのですが、jspは検索に引っかかりにくい言語みたいだし、 なにか良い言語があったら理由も含めて教えてください
よろしくおねがいします。

Aベストアンサー

jspが検索にひっかかりにくいってのは単に検索の仕方の問題では?
jspはjavaの構文がそのまま使えるので、
ネットの情報量としては一番多いかと思います。

Q_beginthreadexで生成したスレッドの返り値を取得する方法

_beginthreadexで生成したスレッドの返り値を取得するにはどうしたらよいでしょうか。
例えば以下のコードでスレッドmythrdの返り値をmain関数のなかで取得するのはどういった手段がありますでしょうか。


unsigned __stdcall mythrd(void *);

int main()
{
DWORD thID;
HANDLE hTh;

hTh = (HANDLE)_beginthreadex(NULL, 0, mythrd, NULL, 0, &thID);
DWORD rc = WaitForMultipleObjects(1, hTh, TRUE, INFINITE);

//スレッドmythrdの実行結果に応じた処理を行う
//...

return 0;
}

unsigned __stdcall mythrd(void *lpx)
{
int iRc;
iRc = func();

return iRc;
}

_beginthreadexで生成したスレッドの返り値を取得するにはどうしたらよいでしょうか。
例えば以下のコードでスレッドmythrdの返り値をmain関数のなかで取得するのはどういった手段がありますでしょうか。


unsigned __stdcall mythrd(void *);

int main()
{
DWORD thID;
HANDLE hTh;

hTh = (HANDLE)_beginthreadex(NULL, 0, mythrd, NULL, 0, &thID);
DWORD rc = WaitForMultipleObjects(1, hTh, TRUE, INFINITE);

//スレッドmythrdの実行結果に応じた処理を行う
/...続きを読む

Aベストアンサー

スレッドハンドルが取れるので…GetExitCodeThread()APIで取得できるんじゃないでしょうか?

QJSPからJSPへ情報を渡せる?

JAVA言語 JSPからの質問がございます。

JSPからJSPへと飛ばすときに、例えば

 a.jspがありそのjspには変数Aと変数Bと変数Cがあります。
リンクをおした時点で条件をつけてA==4
なら、b.jspへ飛びその際変数Bをb.jspにわたす。
 もしノットイコールならc.jspへ飛び、その際変数Cをc.jspにわたす。

なんていうことができるのでしょうか?
もしできるようでしたら、お手数ですが例を打っていただけませんでしょうか?宜しくお願いいたします。

Aベストアンサー

こんにちわ。
仰っているのは、Aの値に応じてリンク先が変わり、且つ、値を遷移先のJSPに渡したいということですよね?

でしたら遷移先については、
<% if (A == 4) { %>
<a href="b.jsp">リンク</a>
<% } else { %>
<a href="c.jsp">リンク</a>
<% } %>
のようにAの値によってリンク先を変更して表示すれば良いと思われます。

あとは、値の渡し方ですが、方法は複数あるように思います。
一つは、セッションを使う方法。もう一つはURLにパラメータとしてつける方法。他にもあるかもしれません。

前者はセッションスコープに値を設定するのが一般的と思われます。
request.getSession().setAttribute("B", "Bの値");
で格納し、遷移先のJSPで
request.getSession().getAttribute("B");
で取り出せます。

後者は、aタグのhrefに「b.jsp?B=3」とかにして、
request.getParameter("B");
で取り出せると思います。

「java セッション」とかで検索するとセッションに入れたオブジェクトの有効範囲(スコープ)などを解説してくれているサイトが見つかるはずです。

参考になれば幸いです。

こんにちわ。
仰っているのは、Aの値に応じてリンク先が変わり、且つ、値を遷移先のJSPに渡したいということですよね?

でしたら遷移先については、
<% if (A == 4) { %>
<a href="b.jsp">リンク</a>
<% } else { %>
<a href="c.jsp">リンク</a>
<% } %>
のようにAの値によってリンク先を変更して表示すれば良いと思われます。

あとは、値の渡し方ですが、方法は複数あるように思います。
一つは、セッションを使う方法。もう一つはURLにパラメータとしてつける方法。他にもあるかもしれません。

...続きを読む

Q親スレッドが子スレッドを監視する方法について(マルチスレッド)

こんにちは。
私は、A端末から送信されたパケットをB端末で受信し、B端末で受信したそのパケットを再度、A端末へ送信するというプログラムを作成しました。

Phase1.A端末(送信側)→B端末(受信側)
Phase2. B端末→A端末
ということです。

上記を実現するために、送信端末において、送信スレッド(親スレッド)と受信スレッド(子スレッド)を立てマルチスレッド処理を行っています。以下にプログラムの概要を示します。

main(int argc ,char *argv[]){
UDPSend(s_port,szServer);
}

static int UDPSend(unsigned short s_port,char *szServer){
hTh = (HANDLE)_beginthreadex(NULL, 0, UDPReceiveData, NULL, 0, &thID);
while((n = fread(send_Buf,1,SEND_DATA_SIZE,fp)) != 0) {
sendto(s1, send_Buf, n, 0, (LPSOCKADDR)&addrin1, sizeof(addrin1));
}
}
unsigned __stdcall UDPReceiveData(void *lpx){
while (1) {
size = recvfrom(s2, recv_Buf, (int)sizeof(recv_Buf) - 1, 0, (SOCKADDR *)&from, &fromlen);
return 0;
}
}

UDPSend関数にて、パケットをB端末へ送信。UDPReceiveData関数にて、B端末からのパケットを受信しています。この場合、UDPSend関数(スレッド?)がUDPReceiveData関数より先に、終わってしまう場合が生じると思っているのですが。

UDPSend関数がUDPReceiveData関数を監視する方法があるのでしょうか?

よろしくお願いします。

こんにちは。
私は、A端末から送信されたパケットをB端末で受信し、B端末で受信したそのパケットを再度、A端末へ送信するというプログラムを作成しました。

Phase1.A端末(送信側)→B端末(受信側)
Phase2. B端末→A端末
ということです。

上記を実現するために、送信端末において、送信スレッド(親スレッド)と受信スレッド(子スレッド)を立てマルチスレッド処理を行っています。以下にプログラムの概要を示します。

main(int argc ,char *argv[]){
UDPSend(s_port,szServer);
}

static int UDPSe...続きを読む

Aベストアンサー

「スレッドの生成~終了待ち~ハンドル解放」を main() でやってみてはいかがですか?
#include <windows.h>
#include <stdio.h>
#include <process.h>
main(){
  HANDLE hTh;
  unsinged thID;
  hTh = createthreadex(省略);
  送信処理();
  WaitForSingleObject( hTh, INFINITE ); //受信スレッド終了待ち
  CloseHandle(hTh);
}
送信処理(){
  ・・・・
  sendto(省略);  
  ・・・・
}
受信処理(){
  ・・・・
  recvfrom(省略);
  ・・・・
}

参考URL:http://msdn2.microsoft.com/ja-jp/library/kdzttdcb.aspx

QJSP・サーブレットとphpどちらがいい?

質問1:どちらがおすすめですか?またこのどちらかじゃなくてもいいので、webサイト構築にお勧めの言語をご教示ください

質問2:jspやサーブレットでfacebookやmixiやok waveみたいなサイトを構築できますか?

質問3:スマートフォン向けのサイトの構築でもjspやサーブレットは使えますか?

Aベストアンサー

こんにちは。


1)環境も含め簡単に作るのであればPHPがお勧めです。
Webに特化していますし。

2)もちろん出来ます。

3)もちろん出来ます。
最終的にクライアントに返るのはどんな言語を使っても同じです。(HTMLやCSS等)

Q再帰関数を使うとき、ソフトウェアスタックはハードウェアスタックと比べてどれくらい遅い?

再帰を使って関数を書こうと思うのですが、再帰する回数が不明なので、スタックオーバーフローを避けるためソフトウェアスタックを使おうと思っている者です。

ソフトウェアスタックはどれくらい遅いのでしょうか?
どう実装すれば速度が改善されるのでしょうか?

Aベストアンサー

ハードウェアスタックって言うのが、スタックポインタ(レジスタ)を使用した物で、ソフトウェアスタックって言うのが、ハードウェアスタックを使用しない擬似スタック操作だとすると、その遅さは?

通常のスタック操作は、アセンブリ言語で1命令になります。
擬似的にソフトウェアでスタック操作を行うとなると、アセンブリレベルで何命令必要か?と言うことになります。
C言語で数命令でもアセンブリレベルだと数~数十命令になりますので、何十倍も遅くなると思います。

call命令等のスタック操作をソフトウェアで実現することはまず無意味なので、おそらくオート変数のみを別配列等で構築し、それを操作する?と言った意味ですか?

そうすると、それ程遅くはならないでしょう。
ポインタを上手く使えば、Cコンパイラの最適化処理が効率よくコンパイルしてくれると思います。
実装方法としては、必要な変数を構造体等にまとめ、その配列を構築し、それらをポインタで管理すればよいと思います。
オート変数の場合は、スタック上に構築した後、スコープを外れる時に破棄する無駄な動きが発生しますが、上記のようにすると、構築・破棄と言った無駄な処理がなくなるので、オート変数を使用した再帰より速くなる可能性が十分あります。
そしてオーバーフローも簡単に管理できますね。

ハードウェアスタックって言うのが、スタックポインタ(レジスタ)を使用した物で、ソフトウェアスタックって言うのが、ハードウェアスタックを使用しない擬似スタック操作だとすると、その遅さは?

通常のスタック操作は、アセンブリ言語で1命令になります。
擬似的にソフトウェアでスタック操作を行うとなると、アセンブリレベルで何命令必要か?と言うことになります。
C言語で数命令でもアセンブリレベルだと数~数十命令になりますので、何十倍も遅くなると思います。

call命令等のスタック操作をソフ...続きを読む


人気Q&Aランキング

おすすめ情報