看下下面一段代码:
class Ctest {
public:
int var1;
int var2;
int var3;
int var4;
Ctest();
};
Ctest::Ctest()
{
printf("entered Ctest\n");
}
int _tmain(int argc, _TCHAR* argv[])
{
int i ;
for(i = 0;i < 23;i ++){
Ctest varobj;
}
return 0;
}
在一个循环体内部 有定义Ctest类对象的操作。
有两个疑问
1)Ctest构造函数执行多少次?
2)在栈上为varobj 保留多少次内存 ?
第一个可以通过打印看出来,执行了23次。
第二个可以通过反汇编代码看看:
编译成Debug模式,扔到OD调试器。跟踪找到程序代码:
01211400 > 55 push ebp
01211401 8BEC mov ebp, esp
01211403 81EC E4000000 sub esp, 0E4
01211409 53 push ebx
0121140A 56 push esi
0121140B 57 push edi
0121140C 8DBD 1CFFFFFF lea edi, dword ptr [ebp-E4]
01211412 B9 39000000 mov ecx, 39
01211417 B8 CCCCCCCC mov eax, CCCCCCCC
0121141C F3:AB rep stos dword ptr es:[edi]
0121141E C745 F8 00000000 mov dword ptr [ebp-8], 0 /// 变量i初始化为0
01211425 EB 09 jmp short 01211430
01211427 8B45 F8 mov eax, dword ptr [ebp-8]
0121142A 83C0 01 add eax, 1 /// i++
0121142D 8945 F8 mov dword ptr [ebp-8], eax
01211430 837D F8 17 cmp dword ptr [ebp-8], 17 /// i < 23
01211434 7D 0A jge short 01211440
01211436 8D4D E0 lea ecx, dword ptr [ebp-20] /// ecx保存类的对象指针,可看出每次调用构造函数ecx都是一样的。
01211439 E8 3EFDFFFF call 0121117C /// 调用构造函数
0121143E ^ EB E7 jmp short 01211427
01211440 33C0 xor eax, eax
01211442 52 push edx
01211443 8BCD mov ecx, ebp
01211445 50 push eax
01211446 8D15 68142101 lea edx, dword ptr [1211468]
0121144C E8 31FCFFFF call 01211082
可以清楚的得到上面答案。