問題タブ [stack-frame]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
templates - D はデリゲートをテンプレート パラメータとしてどのように許可しますか?
Andrei Alexandrescu による「D プログラミング言語」では、
デリゲートがテンプレート パラメーターとして使用される例があります。
Alexandrescu は、デリゲートは実際には関数ポインターとそのスタック フレームへのポインターの 2 つの部分で構成されるファット ポインターであるため、これが機能すると説明しています (これが z が本体内でアクセスできる理由です)。find が "pred" を引数としてではなく、TEMPLATE パラメータとして取ることを除いて。また、テンプレート引数はコンパイル時の定数のみにすることができます。
単体テストの匿名デリゲートのアドレスは確かにコンパイル時の定数であると確信していますが、そのスタック フレームのアドレスは確かにそうであってはなりません。
ここで実際に何が起こっているのですか?
gdb - スタックの中央からのスタックの巻き戻し
私は gdb デバッガーを学習していますが、答えられない質問の 1 つは次のとおりです。新しい関数呼び出しにより、追加のスタック フレームが割り当てられ、呼び出しスタックが下方に成長します。スタック フレームの割り当てが解除され、未使用のメモリに戻されます。スタックの途中にあるフレームを削除してメモリに戻すことは可能ですか? ステートメントまたは longjmp 関数に移動して、これを実現できますか?
どうもありがとう。
function - 再帰とスタック フレームのトラバーサルについて
これは宿題の質問ではありません。私は自分自身の教化のプロセスを理解しようとしているだけです。私はコンピュータ サイエンスの学生として、再帰の概念が議論されたいくつかの講義に出席しました。しかし、私の意見では、講師は、スタック フレームの概念と、最終的な値を計算するためにコール スタックがどのようにトラバースされるかに関して、少しあいまいでした。私が現在想像しているプロセスの方法は、ツリーをトップダウンで構築することに似ています (項目をコール スタックにプッシュする - 後入れ先出しのデータ構造)。頂上に到達。おそらく標準的な例:
上で示したように、コール スタックは最終的に次の (大雑把に) 描かれた図に似ていると思います。
各数値はスタック フレーム内に「囲まれ」、制御は下 (1 の値) から 2、3 のように進みます。ただし、オペレーターがプロセスのどこに存在するかは完全にはわかりません。ある時点で抽象構文木 (AST) が関与していると想定するのは間違いでしょうか? それとも演算子を含む 2 番目のスタックが存在するのでしょうか?
助けてくれてありがとう。
〜ケイトリン
編集:「再帰」タグを削除し、「関数」および「スタックフレーム」タグを追加しました。
arrays - アセンブリ言語で配列をスタック フレームにコピーする
スタック フレームにコピーして配列する必要があるとしましょう。これを X と呼びます。手順を終了する前に、そのスタック フレームを画面に表示します。その配列をスタック フレームにコピーするにはどうすればよいでしょうか。私はこれを思いつきましたが、うまくいきません。
では、EBP を使用して配列 X をスタック フレームに追加するにはどうすればよいでしょうか。私はアーバインなどを使用していません。.386 .MODEL フラット、stdcall
.STACK 4096
Microsoft Visual C++ を使用しています
java - スタック マップ フレームとは
私は最近、自分のプログラムが機能する理由をよりよく理解するためにJava 仮想マシン仕様(JVMS) を見てきましたが、よく理解していないセクションを見つけました...
セクション4.7.4では StackMapTable属性について説明し、そのセクションではスタック マップ フレームの詳細について説明します。問題は、それが少し冗長であることです。私は例から学ぶのが一番です。読むことによってではありません。
最初のスタック マップ フレームがメソッド記述子から派生していることは理解していますが、その方法がわかりません (おそらくここで説明されています)。また、スタック マップ フレームが何をするのか完全には理解していません。それらはJavaのブロックに似ていると思いますが、スタックマップフレームを相互に配置することはできないようです。
とにかく、具体的な質問が 2 つあります。
- スタック マップ フレームは何をしますか?
- 最初のスタック マップ フレームはどのように作成されますか?
と 1 つの一般的な質問:
- JVMS で提供されている説明よりも言葉が少なく、理解しやすい説明を誰かが提供できますか?
c++ - C++ と Swift: C++ スタック フレームで構造体はどのように処理されますか? Swift が構造体の継承をサポートしない理由は、構造体の継承の複雑さですか?
最近の開発者ミーティングで、Swift のstruct
継承 (より正確にはstruct
Swift の継承の欠如) のトピックが簡単に議論されました。struct
Swift が継承をサポートしていない理由は次のとおりだと思います。
struct
s は値型です- 値の型はスタック フレーム間でコピーされます
- 継承は、 a のサイズ
struct
が異なる可能性があることを意味します (たとえば、Lorry
継承元Vehicle
とLorry
追加の.weightCapacity
場合Lorry
、 よりも多くのスペースが必要になりますVehicle
) - コンパイル時に不明なサイズの値型パラメーターを持つと、呼び出し元のスタック フレームの構築と呼び出し先のデータへのアクセスが複雑になります。
Swift が継承struct
を許可しないのは、これらの複雑さが原因であり、おそらく a を含むすべての関数呼び出しに余分な操作が追加され、パフォーマンスが低下するためだと思います。struct
この推論は正しいですか?
しかし、私はC++について考えました。C++ は継承を許可struct
しており、C++ は非常にパフォーマンス重視です。struct
これは、Swift が継承を許可しないという私の推論が間違っていると思わせます。C++ はどのようにしてstruct
パフォーマンスに悪影響を与えずに継承を達成しましたか?
gdb - 関数を呼び出すときに EBP に何が起こるか
これはプログラムです:
GDB から:
GDB から、EBP が main() の ESP と同じ値を持たないのはなぜですか? mov ebp, esp
EBP == にするべきではありません0xffffcf88
か? これにより、EBP が ESP に設定されると思いました。
編集:
私は自分の質問に答えたかもしれないと思います。私を修正してください。ESP は、リターン アドレスと保存されたフレーム ポインターがスタックにプッシュされるときに移動されます。
このESP
値は0xffffcf88
、2 つの値 (両方とも 4 バイト) がスタックにプッシュされる前のものです。その後、その値は0xffffcf88 - 0x8
==0xffffcf80
です。これがEBPの現在の価値です。次に ESP -= 0x10 です。
ESP の値はどのように変更されますか? のようなものmov ESP, ESP - 0x8
ですか?