C++ の逆アセンブリを見てみましょう。:)
通常、戻り値をスタックに保存し、すべてのローカル オブジェクトのデストラクタを呼び出してから、戻り値をスタックからeax
レジスタに移動します (cdecl 呼び出し規約)。デストラクタはそのeax
レジスタを変更できるため、保存が必要です。
たとえば、次の非常に架空の疑似アセンブリを見てください。
// inside imaginary function
mov [ebp-0Ch],eax; // save eax register
lea ecx, [ebp-4]; // [ebp-4] == your object address
call Foo::~Foo(); // call the destructor
mov eax,[ebp-0Ch]; // retrieve the saved return value
ret; // now return
返された値がローカル オブジェクトの場合は、もちろん、最初にそのオブジェクトを準備されたスペースにコピーする必要があります。
// pseudo function call
int i = func();
ここでは、戻り値のスペースがfunc
スタックに提供され、そこに戻り値をコピーします。その後、上記のように進みます。