__thiscall

Microsoft 固有の__thiscall 呼び出し規則は、x86 アーキテクチャ上の C++ クラス メンバー関数で使用されます。 これは、可変引数 (vararg 関数) を使わないメンバー関数によって使用される既定の呼び出し規則です。

__thiscall では呼び出し先がスタックをクリーンアップしますが、これは vararg 関数では不可能です。 引数は、スタックに右から左へプッシュされます。 this ポインターは、スタックではなく、レジスタ ECX を介して渡されます。

ARM、ARM64、x64 コンピューターでは、__thiscall がコンパイラによって受け入れられたり、無視されたりします。 これは、既定でレジスタベースの呼び出し規則が使用されるためです。

__thiscall を使用する理由の 1 つは、メンバー関数が既定で __clrcall を使用するクラスにあります。 その場合、__thiscall を使用して、個々のメンバー関数をネイティブ コードから呼び出せるようにすることができます。

/clr:pure を指定してコンパイルすると、すべての関数および関数ポインターは、特に指定がない場合は __clrcall になります。 /clr:pure および /clr:safe コンパイラ オプションは Visual Studio 2015 では非推奨とされており、Visual Studio 2017 ではサポートされていません。

vararg メンバー関数では __cdecl の呼び出し規則が使用されます。 関数のすべての引数は、スタックにプッシュされ、this ポインターが最後にスタックに配置されます。

この呼び出し規則は C++ だけに適用されるため、C の名前の装飾スキームはありません。

非静的クラス メンバー関数をアウトオブラインで定義する場合は、宣言内でのみ呼び出し規則修飾子を指定します。 アウトオブライン定義でもう一度指定する必要はありません。 コンパイラは、定義の時点で宣言時に指定された呼び出し規則を使用します。

関連項目

引数の受け渡しと名前付け規則