0

を呼び出すとF(argument_expression)argument_expressionF のスタックをプッシュする前に評価されますか?

たとえば、 を呼び出すときF(G(H(arg)))、コンパイラは最初に H のスタックをプッシュし、H を評価し、ポップし、次に G のスタックをプッシュしますか? それとも、最初に F のスタックをプッシュし、次に G をプッシュし、次に H をプッシュし、次に 3 つのレイヤーをポップバックしますか?

また、一方の方法はもう一方の方法よりも高速ですか?

4

4 に答える 4

3

実際には、直交する 2 つの質問をしました。

評価の概念は、プログラマーの観点から提案されており、この場合、C++ 標準によって明確に定義されています。はい、関数への引数は、その関数が呼び出される前に常に評価されます。

ただし、標準では、スタックの管理方法は指定されていません。コンパイラは、提案されたアプローチのいずれかを自由に採用できます。もちろん、1 つ以上のネストされた関数を直接インライン化するという 3 番目のオプションが必要になる場合もあります。おそらく他の選択肢があります。

于 2011-06-22T22:54:47.207 に答える
1

パラメーターは、仕様ごとに、呼び出された関数が実行される前に完全に評価されます。

すなわち:あなたの例では、実行H(arg)する前に完全に評価されます。G(result of H(arg))

いつでも、スタックの深さは 1 レベルになります。

于 2011-06-22T22:21:33.220 に答える
0

H,G,Fエッセンシャルを押して何を意味するかによりますが、このようになります

F の戻り値がプッシュされ、一時変数がプッシュされ、次に G がプッシュされます (その戻り値と一時変数) 最後にすべての H がプッシュされ、評価され、ポップされます。次にG、最後にF。

引数式を使用すると、パフォーマンスが向上します。ジャンプを含むべきではないためです。

于 2011-06-22T22:27:52.037 に答える
0

いいえ、それらは順番に評価されます (この場合は 1 フレームの深さのみ)。

于 2011-06-22T22:17:40.913 に答える