ホームページ >バックエンド開発 >C++ >RAX が「std::function」による末尾呼び出しの前にスタックにプッシュされるのはなぜですか?

RAX が「std::function」による末尾呼び出しの前にスタックにプッシュされるのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-13 01:11:16176ブラウズ

Why is RAX Pushed onto the Stack Before a Tail Call with a `std::function`?

最後呼び出しの前に RAX がスタックにプッシュされるのはなぜですか?

std::function 引数を取る関数 f のアセンブリ出力を見ると、次のことがわかります。興味深い操作です。末尾呼び出しの直前に、RAX がスタックにプッシュされます。この動作は、std::function ラッパーを使用しない単純な末尾呼び出しでは観察されません。

アライメントに関する考慮事項

RAX をプッシュする理由は 64 ビットに根ざしています。 ABI。呼び出し命令の前にスタックを 16 バイトにアラインする必要があります。 call 命令は 8 バイトの戻りアドレスをスタックにプッシュし、アライメントに違反します。これを修正するには、コンパイラは末尾呼び出しの前にスタックを 16 バイトの倍数に再調整する必要があります。

効率的なスタック アライメント

ドントケア値のプッシュRAX と同様に、スタックのアライメントを達成する効率的な方法です。次の理由からです。

  • スタック一部の CPU 上のエンジンは、sub rsp、8 と比較して動作を最適化できます。
  • スタックにプッシュされた値は、関数内で使用されないため無関係です。

RAX をプッシュすることにより、コンパイラは関数の動作を中断することなくアラインメント要件を満たします。

以上がRAX が「std::function」による末尾呼び出しの前にスタックにプッシュされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。