ホームページ  >  に質問  >  本文

java - C,C++函数调用时入栈顺序 是编译时还是运行时完成的?

我的理解是静态编译时,因为C语言是过程性语言只能静态联编不能动态联编,而C++编译于此类似,所以是编译时完全。不知道这样对不对?

天蓬老师天蓬老师2763日前799

全員に返信(3)返信します

  • 阿神

    阿神2017-04-18 10:50:16

    スタックにプッシュする順序はコンパイル時に決定されます。

    関数呼び出しの前にスタックにプッシュする必要がある主なものは関数パラメーターであり、パラメーターはすべて固定されています (変数パラメーターはマクロによって決定される単なるオフセットです)。
    関数を呼び出すためのコードはコードセグメントに配置され、スタックへのプッシュは命令の形式で行われるため、順序はコンパイル時に決定されます。

    返事
    0
  • 阿神

    阿神2017-04-18 10:50:16

    @lianera は正しいです。スタックにプッシュする順序はコンパイル時に決定されます。

    例を示しましょう:
    次のようなコードがあります

    リーリー

    コンパイル後のアセンブリコードは次のようになります

    リーリー

    アセンブリを理解していなくても問題ありません。コンパイルの過程で、パラメータを渡す順序や、パラメータやローカル変数などをスタック上のどこに配置するか(相対位置)がすべて決まります。 。対応するプログラムを実行すると、コンパイルされた順序でスタックが動作します。

    返事
    0
  • PHP中文网

    PHP中文网2017-04-18 10:50:16

    スタックへのプッシュは実行時にのみ発生するプロセスではないでしょうか?コンパイルは単にバイトコードに変換するプロセスです。なぜスタックにプッシュするのでしょうか?

    返事
    0
  • キャンセル返事