__fastcall

読み:アンダースコア・アンダースコア・ファストコール
外語:__fastcall: Fast call
品詞:名詞

80x86系プロセッサにおける、関数の呼び出し規約の一つ。

MicrosoftやBorlandのC/C++コンパイラ、およびBorlandのDelphiコンパイラなどで対応している。

変数の幾つかは、先頭(左)から幾つかをレジスタ経由で渡す。

引数は、可能な範囲でレジスタで渡される(従って速い)。

x86系はレジスタが少なく、現実には変数のうち2〜3個しかレジスタ渡しができないため、fastcallと言うほどの高速化が期待できるのかどうかは謎である。

なお、引数が浮動小数点数または構造体型の場合にはレジスタは使われない。

Microsoft

Microsoft系のC/C++では、次のような特徴がある。

  • 引数の渡しかた: 左から2つはECX、EDXレジスタ経由、残りはスタック経由
  • スタックへの積みかた: 右から左にPUSHする
  • スタックに積まれた引数の始末: 関数が呼び出された側で行なう

変数の型の特定が必要なため、__fastcallの関数はプロトタイプ宣言が必須である。

Borland

Borland系のC/C++/Delphiでは、次のような特徴がある。

  • 引数の渡しかた: 左から3つはEAX、EDX、ECXレジスタ経由、残りはスタック経由
  • スタックへの積みかた: 左から右にPUSHする
  • スタックに積まれた引数の始末: 関数が呼び出された側で行なう

変数の型の特定が必要なため、__fastcallの関数はプロトタイプ宣言が必須である。

つまり、Microsoftの__fastcallとBorlandの__fastcallは互換性がないため、__msfastcallというキーワードが用意されている。

Delphiの場合は標準で__fastcallである。Borland C++BuilderでVCL(Visual Component Library)を使った時は__fastcallだらけになるが、これはDelphiとの互換性のためである。