呼び出し規約

 

「__stdcall」とは、Microsoft Visual C++などの開発環境で用いられる、

関数の呼び出し規約の一つです。

__stdcall規約では、関数を呼び出す際に、呼び出し元がスタックに引数をプッシュし、

呼び出された関数がその引数をポップする方式を採用します。この際、関数の呼び出し

元と呼び出された関数の間でスタックのアライメントに関する合意が必要になることが

あります。

 

__stdcall規約は、一般的にはWindows APIなどのように、呼び出し元と呼び出される

関数のプログラムが異なる場合に用いられます。

これは、__stdcall規約を用いることで、異なるプログラム間での関数の呼び出しを

確実に行うことができるためです。

なお、__stdcall規約は、呼び出し規約の一例であり、他にも__cdeclや__fastcallなどの

規約があります。それぞれの規約によって、スタックの扱いや引数の渡し方、

戻り値の扱いなどが異なります。

 

呼び出し

規約

引数の渡し方 スタックの扱い 戻り値の扱い 主な使用例
__cdecl スタックに右から左に引数をプッシュ 呼び出し元がスタックをクリーンアップ EAXレジスタに格納される C/C++標準
__stdcall スタックに左から右に引数をプッシュ 呼び出された関数がスタックをクリーンアップ EAXレジスタに格納される Windows API
__fastcall レジスタとスタックを併用して引数を渡す 呼び出された関数がスタックをクリーンアップ EAXレジスタに格納される Borland C++
__vectorcall SSEレジスタを利用した引数の渡し方 呼び出された関数がスタックをクリーンアップ XMM0レジスタに格納される Visual C++ 2012以降
__thiscall メンバ関数において、インスタンスをECXレジスタに渡す 呼び出された関数がスタックをクリーンアップ EAXレジスタに格納される C++メンバ関数

呼び出し規約は、プラットフォームや開発環境によって異なる場合があります。

開発環境によっては、デフォルトで使われる呼び出し規約があることもあります。

呼び出し規約によって、スタックの扱いやレジスタの使用方法が異なるため、

プログラムの実行速度や効率に影響を与えることがあります。