00401E79 mov [g_Number (00416900)],eax
00401E7E mov ecx,dword ptr [g_Number (00416900)]
00401E84 push ecx
00401E85 push offset string "Construct CMemoryItem Nember[%d]"... (004153f0)
00401E8A mov edx,dword ptr [ebp-10h]
00401E8D push edx
00401E8E call CString::Format (00402316)
00401E93 add esp,0Ch
225: OutputDebugString(m_info);
00401E96 mov ecx,dword ptr [ebp-10h]
00401E99 call CString::operator char const * (0040229e)
00401E9E mov esi,esp
00401EA0 push eax
00401EA1 call dword ptr [__imp__OutputDebugStringA@4 (004173ec)]
00401EA7 cmp esi,esp
00401EA9 call _chkesp (00402328)
00401EAE mov dword ptr [ebp-4],0FFFFFFFFh
00401EB5 mov eax,dword ptr [ebp-10h]
00401EB8 mov ecx,dword ptr [ebp-0Ch]
00401EBB mov dword ptr fs:[0],ecx
00401EC2 pop edi
00401EC3 pop esi
00401EC4 pop ebx
00401EC5 add esp,50h
00401EC8 cmp ebp,esp
00401ECA call _chkesp (00402328)
00401ECF mov esp,ebp
00401ED1 pop ebp
00401ED2 ret
这部分汇编代码与上节的相比较看一下有什么不同?和上面的一样,这部分汇编代码也是函数初始化代码、类初始化代码、函数体代码3部分。首先看一下第一部分显然没有什么不同;接下来看看类初始代码部分开始是对成员变量的构造,但是少了虚函数表的初始化,从这里可以发现没有虚函数的类会比有虚函数的类少4个字节,这也能解释上节的类是8个字节而这里是4个字节了;最后看看剩下的汇编代码也差不多一样。
从这里可以总结出没有虚函数的类会比有虚函数的类少4个字节,在类的构造代码中也不会有对虚函数表的初始化。这点很重要将影响它们在释放内存时一些流程的不同。下面讲delete操作时再详细讨论。
|