C++からのアセンブラルーチンの呼び出し
このセクションの内容:
Cの呼び出し規約は、C++関数には適用されません。最も重要なことは、関数名だけではC++関数を特定できない点です。型安全なリンケージを保証し、オーバロードを解決するために、関数のスコープと型も必要になります。
もう1つの違いとして、非静的メンバ関数が、別の隠し引数であるthis ポインタを取る点があります。
ただし、Cリンケージを使用する場合は、呼び出し規約はCの呼び出し規約に準拠します。したがって、アセンブラルーチンは以下の方法で宣言した場合にC++から呼び出されます。
extern "C"
{
int MyRoutine(int);
}以下の例は、非静的メンバ関数と同等の処理を実現する方法を示します。すなわち、暗黙的なthisポインタを明示する必要があります。アセンブラルーチンの呼び出しをメンバ関数内にラップできます。関数インライン化が有効になっていれば、インラインメンバ関数を使用することで、余分な呼び出しによるオーバヘッドが解消されます。
class MyClass;
extern "C"
{
void DoIt(MyClass *ptr, int arg);
}
class MyClass
{
public:
inline void DoIt(int arg)
{
::DoIt(this, arg);
}
};