c++関数呼び出しの戻り値が関数呼び出しスタック上で呼び出し者にどのように渡されるか(大きなオブジェクトを返す場合)
関数の戻り値がint型やdouble型のように小さい場合、戻り値はeaxまたはeaxおよびedxを介して呼び出し元に渡されます.
戻り値が大きいオブジェクトの場合は、次のようになります.
すると、main()関数がfoo()を呼び出す前に、自分のスタックフレームに隠しパラメータとしてfoo()にアドレスが渡される一時空間が開き、Student suを返す必要がある場合には、この一時空間にStudent suを構築し、この空のアドレスをレジスタeaxでmain()関数に返す.これによりmain()関数はfoo()関数の戻り値を得ることができる.
戻り値が大きいオブジェクトの場合は、次のようになります.
class Student
{
char name[30];
int id;
int age;
};
Student foo()
{
Student su;
return su;
}
int main()
{
Student s;
s = foo();
return 0;
}
すると、main()関数がfoo()を呼び出す前に、自分のスタックフレームに隠しパラメータとしてfoo()にアドレスが渡される一時空間が開き、Student suを返す必要がある場合には、この一時空間にStudent suを構築し、この空のアドレスをレジスタeaxでmain()関数に返す.これによりmain()関数はfoo()関数の戻り値を得ることができる.