C++ 中对象的内存模型

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) 

}

 

可见,对象在内存中保存时,数据和方法是分开保存的,只不过在编译器的控制下,可以准确调用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值