No.3ベストアンサー
- 回答日時:
ハードウェアスタックって言うのが、スタックポインタ(レジスタ)を使用した物で、ソフトウェアスタックって言うのが、ハードウェアスタックを使用しない擬似スタック操作だとすると、その遅さは?
通常のスタック操作は、アセンブリ言語で1命令になります。
擬似的にソフトウェアでスタック操作を行うとなると、アセンブリレベルで何命令必要か?と言うことになります。
C言語で数命令でもアセンブリレベルだと数~数十命令になりますので、何十倍も遅くなると思います。
call命令等のスタック操作をソフトウェアで実現することはまず無意味なので、おそらくオート変数のみを別配列等で構築し、それを操作する?と言った意味ですか?
そうすると、それ程遅くはならないでしょう。
ポインタを上手く使えば、Cコンパイラの最適化処理が効率よくコンパイルしてくれると思います。
実装方法としては、必要な変数を構造体等にまとめ、その配列を構築し、それらをポインタで管理すればよいと思います。
オート変数の場合は、スタック上に構築した後、スコープを外れる時に破棄する無駄な動きが発生しますが、上記のようにすると、構築・破棄と言った無駄な処理がなくなるので、オート変数を使用した再帰より速くなる可能性が十分あります。
そしてオーバーフローも簡単に管理できますね。
No.4
- 回答日時:
手元のアセンブラマニュアルを見てみると、
PUSH命令が1~4クロック、
POP命令が1~6クロックで、わりと遅いです。
もっとも、これは486時代のデータなので、古くてあてになりません。
最近のCPUはパイプライン処理とかややこしいことをしているので、
はっきりと「何倍遅い」とは計算できないと思います。
そこをあえて考えてみると…
まず、ソフトウェアスタックを実現するためには、
(1)ポインタの読み出し。
(2)スタックするデータを、ポインタが指すアドレスへ書き出す。
(3)ポインタをデータサイズ分加算。
(4)ポインタのメモリへの書き込み。
によってPUSH動作が行えます。(POPも同じようなもの)
これらはあまり重い処理ではない(読み出し・書き込みは
486でも1クロックで実現できる)ので、
「遅くなるにしても、せいぜい4倍程度」
ではないかと思います。
これに加えて、スタックオーバーフローのチェックをする場合、
・ポインタ制限値の読み込み。
・ポインタ制限値とポインタ値の比較。
・分岐命令。
などで、同じくらいかかる可能性があります。
これを考えに入れても
せいぜい8倍程度ではないでしょうか。
最適化が働けば(たとえばポインタ値をレジスタに置いておくなど)、
もっと早くなる可能性はあります。
逆に、最適化がうまく行かなければ遅くなる可能性もあります。
パイプライン処理がうまく行くか行かないかも関係してきます。
というわけで、おもいっきり自信なしですが、
「オーバーフローチェックを入れてもせいぜい一ケタ弱の差」
というあたりかなあ…と思います。
No.2
- 回答日時:
>再帰する回数が不明なので
ある程度の最大数はわかるのでは?
65000個のデータをクイックソートしても16個
41憶のデータでも必要な領域は32個だけですよ?
No.1
- 回答日時:
> スタックオーバーフローを避けるためソフトウェアスタックを使おうと思っている者です。
ソフトウェアスタックってなんですか?
それだとオーバーフローしないのはナゼですか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(コンピューター・テクノロジー) 量子コンピュータの動作原理がわかりません。同じビットが、1でも0でも有って良いだろうか? 3 2023/02/04 03:20
- カスタマイズ(車) 自動車の亀の子スタックを引っ張り出すには何トンぐらいのけん引力が要りますか? 3 2022/12/25 10:31
- アンテナ・ケーブル LS56 水平スタック vs LS206TMH 1本 ・指向性 ・利得 ・前後比 ・バイトパターン 4 2023/05/18 16:59
- ルーター・ネットワーク機器 Wifi速度低下で困ってます。 5 2023/01/23 10:19
- iPhone(アイフォーン) iPhone(ちなみちiPhone 14 Pro) の、通知って不具合ずっと起きていませんか?(スタ 1 2023/02/10 18:40
- ノートパソコン Windows 10 動作改善方法 6 2023/04/26 22:30
- C言語・C++・C# sprintf()の使い方について 1 2022/08/17 16:16
- マウス・キーボード Logicool optionsについての質問です。 私が使っているレシーバーはUnifyingです 1 2022/09/22 23:39
- ガラケー・PHS SMSメールの受信遅延原因はガラケー自体の欠陥では 8 2022/08/06 11:46
- アンテナ・ケーブル https://detail.chiebukuro.yahoo.co.jp/qa/question_ 2 2023/02/12 10:29
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.netでDLLを読み込んで実行す...
-
スタックフレームの消滅
-
_CRTIMPの意味は?
-
プログラムの規模を表す単位「k...
-
ubuntuで デイスク/deb/loopと...
-
パソコンでインターネット接続...
-
ステップ数??
-
ステップ数について
-
SP領域とはなんですか?
-
Macと iPadの違いについて 今現...
-
女子小学生と女子中学生と女子...
-
ライン数とステップ数の違いに...
-
ワープロ検定の勉強法について。
-
最もよいタイピング練習ソフト...
-
AutoCAD LTの中古。
-
Ic-PcAn はどこのこと?
-
ステップカウントツールが作成...
-
サブネットマスクから、ネット...
-
社内LANのネットワークトラフィ...
-
アイソレータとはなんですか?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.netでDLLを読み込んで実行す...
-
最大スタックサイズを大きくす...
-
printf / sprintf のスタック消...
-
エラー?メッセージ
-
_CRTIMPの意味は?
-
スタック領域変更
-
gccでスタックサイズを変更する...
-
スタックを用いて整数配列を入...
-
スタックの伸張方向
-
H8マイコン スタック領域に...
-
関数のプロローグとエピローグ...
-
マクロ実行時の「スタックの不...
-
CASLとCASL2の違いについて
-
Cプログラミングの関数電卓のア...
-
Ethernetヘッダの取得 NDIS
-
C言語・スタックを使用した逆...
-
再帰処理を非再帰処理に書き換...
-
スタックとキューについて
-
pthreadのスタックサイズ設定取...
-
無償Borland5.51でスタックメモ...
おすすめ情報