「__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++のメンバ関数 |
呼び出し規約は、プラットフォームや開発環境によって異なる場合があります。
開発環境によっては、デフォルトで使われる呼び出し規約があることもあります。
呼び出し規約によって、スタックの扱いやレジスタの使用方法が異なるため、
プログラムの実行速度や効率に影響を与えることがあります。