最後呼び出しの前に RAX がスタックにプッシュされるのはなぜですか?
std::function 引数を取る関数 f のアセンブリ出力を見ると、次のことがわかります。興味深い操作です。末尾呼び出しの直前に、RAX がスタックにプッシュされます。この動作は、std::function ラッパーを使用しない単純な末尾呼び出しでは観察されません。
アライメントに関する考慮事項
RAX をプッシュする理由は 64 ビットに根ざしています。 ABI。呼び出し命令の前にスタックを 16 バイトにアラインする必要があります。 call 命令は 8 バイトの戻りアドレスをスタックにプッシュし、アライメントに違反します。これを修正するには、コンパイラは末尾呼び出しの前にスタックを 16 バイトの倍数に再調整する必要があります。
効率的なスタック アライメント
ドントケア値のプッシュRAX と同様に、スタックのアライメントを達成する効率的な方法です。次の理由からです。
RAX をプッシュすることにより、コンパイラは関数の動作を中断することなくアラインメント要件を満たします。
以上がRAX が「std::function」による末尾呼び出しの前にスタックにプッシュされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。