C/C のさまざまな呼び出し規約を理解する
C/C にはさまざまな呼び出し規約があり、それぞれに明確な特徴と意味があります。関数呼び出しの場合。これらの規則により、引数が関数に渡される方法と戻り値がどのように処理されるかが決まります。
利用可能な呼び出し規則
C/C で使用できる主な呼び出し規則は次のとおりです。
-
cdecl: 引数はスタックにプッシュされます右から左へ、呼び出し先が保存したレジスター (EAX、ECX、EDX) と呼び出し元が保存したレジスター (スタック ポインターとその他) を持ちます。
-
syscall: cdecl と似ていますが、 EAX、ECX、EDX は保持されません。パラメータ リストのサイズは AL で渡されます。
-
pascal: 引数は左から右にスタックにプッシュされ、呼び出し先はスタックのバランシングを担当します。
-
stdcall: Pascal のバリエーション。呼び出し先はスタックのクリーンアップを担当しますが、パラメーターはスタックに右から左にプッシュされます。 EAX、ECX、および EDX は、関数内で使用するように指定されています。
-
fastcall: 最初の 2 つの引数を ECX および EDX レジスタに渡し、残りの引数を右から左にスタックに渡します。 .
延長通話規約
これらの標準規約に加えて、特殊なバリアントがあります:
-
vectorcall: SIMD レジスタを使用してベクトル引数を渡し、受け渡しのサポートを拡張します。同次ベクトルの集計値。
-
safecall: COM エラー処理をカプセル化します。例外は EAX の HResult として返され、結果はスタック上で参照によって渡されます。
-
Microsoft X64 呼び出し規約: 整数および浮動小数点の引数に特定のレジスタを使用します。追加の引数をスタックにプッシュします。呼び出し元は、スタック上に「シャドウ スペース」を割り当てる責任があります。
正しい規則の選択
適切な呼び出し規則は、特定のプラットフォーム、コンパイラーによって異なります。 、および申請要件。呼び出し規約を選択するときは、パラメーター数、レジスターの使用法、パフォーマンスの最適化などの要素を考慮してください。
たとえば、Windows API 関数を呼び出すには stdcall が一般的に使用されますが、Unix のような環境では cdecl がよく使用されます。 fastcall は、パラメーターが少ない関数のパフォーマンスを向上させる可能性があります。
追加リソース
- [Microsoft Docs: 呼び出し規約](https://docs.microsoft. com/en-us/cpp/build/x64-calling-convention)
- [Wikipedia:呼び出し規約](https://en.wikipedia.org/wiki/Calling_convention)
以上がさまざまな呼び出し規約は C/C の関数呼び出しにどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。