11

私は何人かの人々が言っ​​ているのを聞いて、他の呼び出しの代わりに2つのパラメータを登録する__fastcallよりも速い__cdeclと言っています。__stdcallしかし一方で、これは C で使用される標準ではありません。

__fastcallCの標準のように望ましくない理由と、コードでこれをいつ使用するかを知りたいです。

4

2 に答える 2

11

x86 プラットフォームは、グローバルな ABI と呼び出し規約を定義していないという点で異例です。

Win32/x86 で標準化されていstdcallます。呼び出し規則の間にはさまざまなトレードオフがあります。パラメーターをレジスターに配置する方が高速ですが、以前にそれらのレジスターを使用していたものを呼び出し元に強制的にスピルさせます。そのため、どちらが優れたパフォーマンスを発揮するかを予測するのは困難です。

重要なことは、異なるコンパイラ (さらには異なるプログラミング言語) 間の相互運用性を可能にする、統一された標準呼び出し規則を持つことです。

cdecl他のプラットフォームには、、、stdcallまたはfastcall規則がありません。それらは同じレジスターのセットを持っていません。場合によっては、レジスタがまったくないこともあります。ただし、C コードは引き続き使用できます。

Win32/x86_64 は を使用せずstdcall、アーキテクチャ定義の規則を使用します。

Linux/x86 にも規約があります。

于 2012-10-26T15:31:02.850 に答える
4

ライブラリ インターフェイスに指定する呼び出し規約をお探しですか? 他のすべての関数については、呼び出し規約をまったく指定しないためです。コンパイラの最適化パス (たとえば、自動インライン化) は、おそらく呼び出し規約を役に立たなくします。

ただし、fastcall に関しては、覚えている限りでは標準化されていないため、ライブラリ コードには適していません。ここに素晴らしい概要があります: Calling Conventions Demystified

于 2012-10-26T15:31:34.087 に答える