fun()函数的工作机制:

32:   HowMany f(HowMany x) {
33:     x.print("x argument inside f()");
004015DB   push        offset string "x argument inside f()" (0046f030)
004015E0   lea         ecx,[ebp+0Ch]
004015E3   call        @ILT+575(HowMany::print) (00401244)
34:     cout << "Return From f()" << endl;
004015E8   push        offset @ILT+200(std::endl) (004010cd)
004015ED   push        offset string "Return From f()" (0046f01c)
004015F2   push        offset std::cout (0047ce98)
004015F7   call        @ILT+660(std::operator<<) (00401299)
004015FC   add         esp,8
004015FF   mov         ecx,eax
00401601   call        @ILT+480(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004011e5)
35:     return x;
00401606   lea         eax,[ebp+0Ch]    ; [ebp+0C]为Temp的内存地址
00401609   push        eax
0040160A   mov         ecx,dword ptr [ebp+8]   ; [ebp+8]为h2的内存地址,ecx指向h2内存块
0040160D   call        @ILT+0(HowMany::HowMany) (00401005) ; 调用拷贝构造函数,将Temp的内容拷贝到h2的内存中
00401612   mov         ecx,dword ptr [ebp-10h]
00401615   or          ecx,1
00401618   mov         dword ptr [ebp-10h],ecx
0040161B   mov         byte ptr [ebp-4],0
0040161F   lea         ecx,[ebp+0Ch]    ; ecx保存Temp的内存地址
00401622   call        @ILT+500(HowMany::~HowMany) (004011f9) ; 调用析构函数,销毁Temp
00401627   mov         eax,dword ptr [ebp+8]   ; eax保存h2的内存地址
36:   }

  对于运行结果

  解析如下:

  1、对象h调用构造函数

  2、输出字符串“Entering f()”

  3、在进入f()函数之前,创建了一个临时对象Temp,调用拷贝构造函数,将对象h的内容拷贝到Temp中

  4、进入f()函数,在执行“return x”语句后,调用拷贝构造函数,将对象Temp的内容拷贝到h2中(完成了h2 = f(h)的工作)

  5、在f()函数结束前,为Temp调用析构函数,销毁Temp对象

  6、退出f()函数,在main函数结束前,先销毁对象h2,后销毁对象h

  ----------------------------------------------------------------------------

  逆向分析时执行“HowMany h2 = f(h);”语句过程中栈分布的记录:

  *****

  进入f()函数前(创建了一个临时对象Temp,调用拷贝构造函数,将对象h的内容拷贝到Temp中)