正在阅读:C++类机制的实现细节C++类机制的实现细节

2004-04-23 10:17 出处:CSDN 作者:nightsuns 责任编辑:linjixiong

  00401098  mov     dword ptr [ebp-14h],0
  0040109F  mov     dword ptr [ebp-4],0FFFFFFFFh
  004010A6  lea     ecx,[ebp-10h] //同样是this指针
  004010A9  call    @ILT+25(CTest::~CTest) (0040101e) //aTest的生存周期到了,自动调用析构函数,同样是由编译器分析之后自加上去
  004010AE  mov     eax,dword ptr [ebp-14h]
  12:  }
  004010B1  mov     ecx,dword ptr [ebp-0Ch]
  004010B4  mov     dword ptr fs:[0],ecx
  004010BB  pop     edi
  004010BC  pop     esi
  004010BD  pop     ebx
  004010BE  add     esp,54h
  004010C1  cmp     ebp,esp
  004010C3  call    __chkesp (00401670)
  004010C8  mov     esp,ebp
  004010CA  pop     ebp
  004010CB  ret
  
  下面再来分析一下VC中对函数的调用:
  可以看到上面有对三个函数的调用分别为:
  00401080  call    @ILT+30(CTest::CTest) (00401023)
  00401093  call    @ILT+5(CTest::a) (0040100a)
  004010A9  call    @ILT+25(CTest::~CTest) (0040101e)
  
  可以看到他们都跳到了以@ILT为基的一个地址去了,那么跳过去之后可以看到:
  @ILT+0(??_GCTest@@UAEPAXI@Z):
  00401005  jmp     CTest::`scalar deleting destructor' (00401130)
  @ILT+5(?a@CTest@@QAEXHH@Z):
  0040100A  jmp     CTest::a (00401230)
  @ILT+10(_main):
  0040100F  jmp     main (00401050)
  @ILT+15(?b@CTest@@QAEXXZ):
  00401014  jmp     CTest::b (004011e0)
  @ILT+20(??_GCTest@@UAEPAXI@Z):
  00401019  jmp     CTest::`scalar deleting destructor' (00401130)
  @ILT+25(??1CTest@@UAE@XZ):
  0040101E  jmp     CTest::~CTest (004011a0)
  @ILT+30(??0CTest@@QAE@XZ):
  00401023  jmp     CTest::CTest (004010f0)
  
  这个@ILT其实就是一个静态的表,它记录了一些函数的入口然后跳过去,每个跳转jmp占一个字节,然后就是一个四字节的内存地址,所以加起为五个字节,这样就实现了类的机制。
  
  下面再来分析一下,类的成员函数调用另一成员函数的情况:
  
  27:  void CTest::a(int one,int two)

键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品