さまざまな呼び出し規約は C/C 関数の実行にどのような影響を与えますか?

Barbara Streisand
リリース: 2024-11-20 03:10:02
オリジナル
256 人が閲覧しました

How Do Different Calling Conventions Impact C/C   Function Execution?

C/C のさまざまな呼び出し規約

C/C では、関数の引数と戻り値の処理方法を指定するさまざまな呼び出し規約が提供されています。これらの規則を理解することは、コードを最適化し、プログラムのさまざまな部分間の効率的な対話を確保するために重要です。

利用可能な呼び出し規則

C/C では、いくつかの呼び出し規則が利用できます。

  • cdecl: 引数はスタックに渡され、値はレジスタに返されます (整数の場合は EAX、浮動小数点数の場合は ST0)
  • syscall: EAX を除き、cdecl と同様です。 、ECX、および EDX レジスタは保持されません
  • pascal: パラメータは左から右にプッシュされ、呼び出し先のバランスはスタック
  • stdcall: 呼び出し元-クリーンアップ stdcall、パラメータは右から左にプッシュ、EAX の戻り値
  • fastcall: 最初の 2 つの引数は ECX と EDX に渡され、残りの引数はスタックにあります
  • vectorcall: SIMD レジスタを使用してベクトル引数を渡す場合
  • safecall: カプセル化されたエラー処理、EAX で返される HResults
  • Microsoft X64 Calling Convention: Windows および UEFI で使用され、RAX の 64 ビット戻り値、RCX-R9 で渡される 64 ビット引数
  • thiscall: cdecl と似ていますが、this 隠し引数を介して渡されたポインタ

詳細説明

cdecl:
cdecl (値による呼び出し) では、呼び出された関数がクリーンアップの責任を負います。戻る前のスタック。引数は右から左にスタックにプッシュされます。

pascal:
pascal (値と結果による呼び出し) では、呼び出し先は返される前にスタックのバランスをとる責任があります。戻り値もスタックに渡されます。

stdcall:
stdcall (値による呼び出し) では、呼び出し先はスタックをクリーンアップする責任があります。引数はスタックに右から左にプッシュされ、戻り値は EAX レジスタに格納されます。

fastcall:
fastcall (レジスタによる呼び出し) では、最初の 2 つの引数ECX および EDX レジスタに渡されます。残りの引数は右から左にスタックにプッシュされます。

**その他の呼び出し規則の詳細については、次の包括的な回答を参照してください。]

以上がさまざまな呼び出し規約は C/C 関数の実行にどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート