从内存角度看待对象-静态分析
1. 源码
debug
|
|
2. x86反汇编分析
首先来看main方法,创建局部对象Derive,首先调用Derive::Derive(void)
构造函数
接着调用Base::Base(void)
构造函数
可以看到Base构造函数,将this对象的前4字节设置为Base的虚表地址
Base对象的虚表就存放了一个它自己的虚析构函数
现在回到Derive构造函数中,发现在调用Base构造函数后,又将将this对象的前4字节设置为Derive的虚表地址
通过发现,Derive和Base的虚表都是只有4个字节的有效数据,都是存放它们各自的析构函数,说明这两个对象不存在其他虚函数。
再回到main中,继续往下分析Derive::showNumber(int)
方法。
调用Derive::showNumber
方法,首先传参num
,再通过eax
传递this指针
在Derive::showNumber
方法中,可以发现调用了Base::setNumber(int)
、Base::getNumber(void)
这两个方法;通过观察可以发现成员Derive::derive
,它在this对象的8~12字节空间存储
现在,分析Base::setNumber(int)
方法,可以发现Base::base
成员存放在this对象4~7字节空间
再次回到main中,调用完Derive::showNumber(int)
方法后,调用Derive对象的析构函数Derive::~Derive(void)
;在Derive::~Derive(void)
方法里会调用Base对象的析构函数Base::~Base(void)
Base::~Base(void)
方法如下
3. 总结
可以发现Derive对象占用12字节空间,创建的Derive对象内部布局如下:
|
|
Derive对象的构造方法的执行顺序:Base::Base(void)
=> Derive::Derive(void)
与之相反的是它的析构方法的执行顺序:Derive::~Derive(void)
=> Base::~Base(void)