C/C の呼び出し規約を理解する
C/C では、さまざまな呼び出し規約により、引数の受け渡し、値の戻り、および戻り値のプロトコルが定義されます。関数の呼び出し時にスタックをクリーンアップします。これらの規則には、stdcall、extern、pascal、およびその他のいくつかが含まれます。
利用可能な呼び出し規則
C/C では、多数の呼び出し規則が利用できます:
-
cdecl: 引数は右から左にスタックにプッシュされ、スタック バランシングは呼び出し元によって処理されます。
-
syscall: cdecl に似ていますが、EAX 、ECX、および EDX レジスタは保持されません。
-
pascal: 引数は左から右にスタックにプッシュされ、呼び出し元がスタックのクリーンアップを担当します。
-
stdcall: 呼び出し元は引数を右から左にプッシュし、呼び出し先は特定の目的で関数内で使用されるスタック、EAX、ECX、および EDX をクリーンアップします。
-
fastcall: 最初の 2 つ引数は ECX および EDX レジスタ経由で渡され、残りの引数は右から左にスタックにプッシュされます。
-
vectorcall: SIMD レジスタを使用してベクトル引数を渡し、ベクトル型と HVA 値を処理します。
-
safecall: COM エラー処理をカプセル化し、例外を EAX に渡し、結果をスタック上で参照します。
-
Microsoft X64 呼び出し規約:特定のレジスタで渡される整数引数、XMM レジスタで渡される浮動小数点引数、スピルに割り当てられるシャドウ スペース。
さまざまな規約の影響
各呼び出し規約には長所と短所があります。たとえば、stdcall は呼び出し側の責任を簡素化し、fastcall はスタック操作を減らすことでパフォーマンスを向上させます。呼び出し規約の選択は、オペレーティング システム、プロセッサ アーキテクチャ、コーディング スタイルの設定などの要因に依存する場合があります。
追加リソース
- [Wikipedia: C呼び出し規約](https://en.wikipedia.org/wiki/Calling_convention#C)
- [関数を呼び出してください! (x86 呼び出し規約)](https://www.agner.org/optimize/calling_conventions.pdf)
- [MSDN: Arm64 の呼び出し規約 (AArch64)](https://docs.microsoft.com /en-us/cpp/build/arm64-abi-for-visual-studio?view=vs-2022)
以上がC/C のさまざまな呼び出し規約は関数の実行にどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。