1、在不涉及虚函数的情况下,一个对象所占用的空间,和一个有相同字段的结构体所占用的空间相同,不会有关于方法的内容。
2、对象的方法同样是放在代码段的,在程序的入口处有一个方法向量表,实际上就是一系列 jmp 函数入口的语句,每一个就表示一个函数。
具体内容,我们可以查看一下下面的反汇编代码:
tc->show(); // tc是一个TestClass 的对象指针
00DC2D83 mov ecx,dword ptr [tc]
00DC2D86 call TestClass::show (0DC12BCh)
函数向量表:
TestClass::~TestClass:
00DC1253 jmp TestClass::~TestClass (0DC6740h)
operator delete:
00DC12B2 jmp operator delete (0DC40A0h)
_HeapFree@12:
00DC12B7 jmp _HeapFree@12 (0DC9450h)
TestClass::show:
00DC12BC jmp TestClass::show (0DC6800h)
void TestClass::show(void) // show 方法的真正入口
{
00DC6800 push ebp
00DC6801 mov ebp,esp
00DC6803 sub esp,0CCh
00DC6809 push ebx
00DC680A push esi
00DC680B push edi
00DC680C push ecx
00DC680D lea edi,[ebp-0CCh]
00DC6813 mov ecx,33h
00DC6818 mov eax,0CCCCCCCCh
00DC681D rep stos dword ptr es:[edi]
00DC681F pop ecx
00DC6820 mov dword ptr [this],ecx
printf("blablabla%d\n",a);
00DC6823 mov esi,esp
00DC6825 mov eax,dword ptr [this]
00DC6828 mov ecx,dword ptr [eax+4]
00DC682B push ecx
00DC682C push 0DCDD6Ch
00DC6831 call dword ptr ds:[0DD11B8h]
00DC6837 add esp,8
00DC683A cmp esi,esp
00DC683C call __RTC_CheckEsp (0DC1352h)
}
可见,对象在内存中保存时,数据和方法是分开保存的,只不过在编译器的控制下,可以准确调用。