ホームページ >バックエンド開発 >C++ >呼び出し規約の違いは、C/C での関数の引数の受け渡しやスタックのクリーンアップにどのような影響を与えるのでしょうか?

呼び出し規約の違いは、C/C での関数の引数の受け渡しやスタックのクリーンアップにどのような影響を与えるのでしょうか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-24 07:31:10837ブラウズ

How do different calling conventions impact function argument passing and stack cleanup in C/C  ?

C/C の呼び出し規約

C/C では、引数を関数に渡す方法とその方法を決定するために、さまざまな呼び出し規約が使用されます。結果が返されます。これらの規則は、スタックまたはレジスターに引数を配置する順序と方法、およびスタックのクリーンアップの責任を決定します。

利用可能な呼び出し規則

C/C複数の呼び出し規約を提供します。以下を含みます:

  • cdecl: 引数はスタックに右から左にプッシュされ、呼び出し側で保存されたデータと呼び出し先で保存されたデータ用に指定された特定のレジスターが使用されます。
  • syscall: cdecl に似ていますが、特定のレジスタを保持せず、レジスタのサイズを渡す必要があります。パラメータ リストを明示的に指定します。
  • pascal: パラメータはスタックに左から右にプッシュされ、呼び出し先はスタックのバランスをとる責任があります。
  • stdcall: 呼び出し先がスタックのクリーンアップを処理するパスカルのバリエーションで、次のように引数が右から左にプッシュされます。 cdecl.
  • fastcall: 最初の 2 つの引数は特定のレジスタに渡され、残りの引数はスタックにプッシュされます。
  • vectorcall: SIMD を使用してベクトル引数を効率的に渡すため
  • safecall: 例外を透過的に処理するために COM (コンポーネント オブジェクト モデル) コンテキストで使用されます。
  • Microsoft X64 呼び出し規約: 標準化された規約Windows および x86-64 アーキテクチャ用のプリブート UEFI で使用され、引数と浮動小数点値に特定のレジスタを利用します。スタック処理に「シャドウ スペース」を使用します。

詳細な説明

これらの呼び出し規約の包括的な概要については、次のリソースを参照してください。

  • ウィキペディア: [C 呼び出し規約](https://en.wikipedia.org/wiki/X86_calling_conventions)
  • MSDN: [C コンパイラーの呼び出し規約](https://docs.microsoft.com/en-us/cpp/build) /x64-calling-convention)
  • インテル: [インテル® 64 および IA-32 アーキテクチャー ソフトウェア開発者マニュアルボリューム 1: 基本アーキテクチャ](https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-manual-325383.pdf )

以上が呼び出し規約の違いは、C/C での関数の引数の受け渡しやスタックのクリーンアップにどのような影響を与えるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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