关于 C++ 栈上的类对象

   看下下面一段代码:

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


可以清楚的得到上面答案。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值