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)
|
正在阅读:C++类机制的实现细节C++类机制的实现细节
2004-04-23 10:17
出处:CSDN
责任编辑:linjixiong
键盘也能翻页,试试“← →”键