これは何?また、開発者としてこれらの影響をどのように受けますか?
4 に答える
呼び出し規約は、何かが別の関数を呼び出す方法を記述します。これには、パラメーターと状態を他の関数に渡す必要があります。これにより、関数が正しく実行され、制御が返されます。これを行う方法を標準化して指定する必要があります。これにより、呼び出されているリモート関数が使用するパラメーターをコンパイラーが順序付けする方法を知ることができます。いくつかの標準的な呼び出し規則がありますが、最も一般的なのはfastcall
、stdcall
、およびcdecl
です。
通常、カスタム呼び出し規約という用語は少し誤解を招き、次の 2 つのいずれかを指します。
非標準の呼び出し規則、または広く使用されていない呼び出し規則 (たとえば、アーキテクチャをゼロから構築している場合)。
コンパイラ/リンカーが実行できる特別な最適化で、パフォーマンスを向上させる目的でワンショット呼び出し規則を使用します。
後者の場合、そうでなければスタックにプッシュされる値の一部が、代わりにレジスタに格納されます。コンパイラは、コード内でパラメーターがどのように使用されているかに基づいて、この決定を行おうとします。たとえば、パラメーターがループ インデックスの最大値として使用される場合、各反復でインデックスが最大値と比較されて、処理を続行する必要があるかどうかが確認されます。登録。
最適化を実行すると、通常はコード サイズが縮小され、パフォーマンスが向上します。
また、開発者としてこれらの影響をどのように受けますか?
開発者としての観点からは、おそらく気にしないでしょう。これは自動的に行われる最適化です。
私はあなたが本当に気にする必要はないと思います。
通常の呼び出し規約は、__stdcallや__fastcallのようなものです。これらは、呼び出し署名がスタックレイアウトに変換される方法を決定し、誰(呼び出し元または呼び出し先)がレジスタの保存と復元などを担当します。たとえば、__ fastcallはより多くのレジスタを使用する必要があり、__stdcallはより多くのスタックを使用します。
カスタム呼び出し規約は、特定の関数とその使用方法に合わせて特別に最適化されています。それらは、特定のモジュールにローカルな関数に対してのみ発生します、IIRC。これが、コンパイラーがその使用方法について多くのことを知っている方法であり、外部の呼び出し元が規則を指定できる必要がないことを知っている方法でもあります。
これに基づいて、コンパイラは適切な場所でそれらを自動的に使用し、コードはわずかに高速に実行され、および/またはわずかに少ないスペースで済みますが、実際には心配する必要はありません。
各言語では、関数を呼び出すときに、レジスタ変数とスタックで渡されるパラメーター、および戻り値がどのように返されるかについての規則があります。
標準の規則とは異なる規則が使用される場合があり、これはカスタム呼び出し規則と呼ばれます。
これは、異なる言語間で相互運用する場合に最も一般的です。たとえば、C と Pascal では、パラメーターの受け渡し方法に関する規則が異なります。C の観点からは、Pascal 呼び出し規則はカスタム呼び出し規則と呼ばれることがあります。
スタックを直接操作したり、ローカル変数を参照するインライン アセンブリを記述したりしない限り、影響はありません。または、異なる呼び出し規約にリンクされたライブラリとのインターフェースの場合
概要: ほとんどのコンパイラなどは、関数の引数が特定の順序でスタックにプッシュされる cdecl などの標準呼び出し規約を使用します。