私は何人かの人々が言っているのを聞いて、他の呼び出しの代わりに2つのパラメータを登録する__fastcall
よりも速い__cdecl
と言っています。__stdcall
しかし一方で、これは C で使用される標準ではありません。
__fastcall
Cの標準のように望ましくない理由と、コードでこれをいつ使用するかを知りたいです。
私は何人かの人々が言っているのを聞いて、他の呼び出しの代わりに2つのパラメータを登録する__fastcall
よりも速い__cdecl
と言っています。__stdcall
しかし一方で、これは C で使用される標準ではありません。
__fastcall
Cの標準のように望ましくない理由と、コードでこれをいつ使用するかを知りたいです。
x86 プラットフォームは、グローバルな ABI と呼び出し規約を定義していないという点で異例です。
Win32/x86 で標準化されていstdcall
ます。呼び出し規則の間にはさまざまなトレードオフがあります。パラメーターをレジスターに配置する方が高速ですが、以前にそれらのレジスターを使用していたものを呼び出し元に強制的にスピルさせます。そのため、どちらが優れたパフォーマンスを発揮するかを予測するのは困難です。
重要なことは、異なるコンパイラ (さらには異なるプログラミング言語) 間の相互運用性を可能にする、統一された標準呼び出し規則を持つことです。
cdecl
他のプラットフォームには、、、stdcall
またはfastcall
規則がありません。それらは同じレジスターのセットを持っていません。場合によっては、レジスタがまったくないこともあります。ただし、C コードは引き続き使用できます。
Win32/x86_64 は を使用せずstdcall
、アーキテクチャ定義の規則を使用します。
Linux/x86 にも規約があります。
ライブラリ インターフェイスに指定する呼び出し規約をお探しですか? 他のすべての関数については、呼び出し規約をまったく指定しないためです。コンパイラの最適化パス (たとえば、自動インライン化) は、おそらく呼び出し規約を役に立たなくします。
ただし、fastcall に関しては、覚えている限りでは標準化されていないため、ライブラリ コードには適していません。ここに素晴らしい概要があります: Calling Conventions Demystified