构造函数 做了什么事
来源:互联网 发布:淘宝客现在还能做吗 编辑:程序博客网 时间:2024/04/28 05:40
快乐虾
http://blog.csdn.net/lights_joy/
lights@hb165.com
本文适用于
Xp sp3
Vs2008
欢迎转载,但请保留作者信息
多年前学习C++的时候就知道每个类都有一个默认的构造函数,但是为什么要有这样的规则却一直不求甚解,汗一个。刚好最近在重新学习C++的内存模型,看看它到底做了么事?
写一个简单的类:
class CParentA
{
public:
CParentA() {}
public:
int parenta_a;
int parenta_b;
public:
virtual void parenta_f1() {this->parenta_a = 0x10;}
virtual void parenta_f2() {this->parenta_a = 0x20;}
public:
void parenta_f3() {this->parenta_a = 0x30;}
void parenta_f4() {this->parenta_a = 0x40;}
};
看看构造函数的汇编代码:
CParentA() {}
00401330 55 push ebp
00401331 8B EC mov ebp,esp
00401333 51 push ecx
00401334 89 4D FC mov dword ptr [ebp-4],ecx
00401337 8B 45 FC mov eax,dword ptr [this]
0040133A C7 00 60 68 40 00 mov dword ptr [eax],offset CParentA::`vftable' (406860h)
00401340 8B 45 FC mov eax,dword ptr [this]
00401343 8B E5 mov esp,ebp
00401345 5D pop ebp
00401346 C3 ret
从这里发现了两行很有意思的代码:
00401337 8B 45 FC mov eax,dword ptr [this]
0040133A C7 00 60 68 40 00 mov dword ptr [eax],offset CParentA::`vftable' (406860h)
我们知道在有vtbl的情况下,this指向的前四个字节用来存放vtbl的指针。原来在构造函数里还有一个工作是要设置vtbl的指针。难怪C++非要在里面插入一个构造函数。
删除我们自己写的构造函数,再构造一个CParentA的对象。
CParentA pa;
0040111E 8D 4D F0 lea ecx,[pa]
00401121 E8 39 FF FF FF call CParentA::CParentA (40105Fh)
还是要调用CParentA::CParentA,看看它做了什么:
CParentA::CParentA:
004013D0 55 push ebp
004013D1 8B EC mov ebp,esp
004013D3 51 push ecx
004013D4 89 4D FC mov dword ptr [ebp-4],ecx
004013D7 8B 45 FC mov eax,dword ptr [this]
004013DA C7 00 60 68 40 00 mov dword ptr [eax],offset CParentA::`vftable' (406860h)
004013E0 8B 45 FC mov eax,dword ptr [this]
004013E3 8B E5 mov esp,ebp
004013E5 5D pop ebp
004013E6 C3 ret
比较两个构造函数的汇编代码可以发现,它们并没有什么不同。
那么,假如一个类没有虚函数,也就没有vtbl,那么它是不是就不需要生成构造函数了呢?试试将CParentA里面的两个虚函数去掉:
CParentA pa;
可以发现,这行代码果然不再生成对构造函数的调用!
- 构造函数 做了什么事
- linux中的fork函数到底做了什么事
- CWnd::SetIcon究竟做了什么事?
- CWnd::SetIcon究竟做了什么事? zz
- CWnd::SetIcon究竟做了什么事?
- 什么事函数式编程
- Ubuntu 12.04 下安装 openGL 驱动时,究竟做了什么事?
- 构造函数 ;构造函数的执行顺序。静态字段的初始化顺序。new关键字为我们做了什么。
- 做什么事都要有风险意识
- QCustomplot使用分享(一) 能做什么事
- 圆明园再造碍您什么事了?
- 看看Drools为我们了什么事
- UIApplicationMain函数做了什么
- UIApplicationMain函数做了什么
- 构造函数加上void就不是构造函数了
- 态度不行,做什么事都不会给力!
- 做什么事会让别人发现你内在的美
- 1个月的业余时间能做什么事
- android ubuntu9.10 源码的编译 Eclipse工程 Contacts编译 应用加载
- 用栈编写的计算器
- 利用过滤器对hibernate的session管理,实现session在线程范围内的共享
- 图的基本算法实现
- auto_ptr 源码
- 构造函数 做了什么事
- 网站测试基本方法-16. 表格测试
- 关于四种XML解析方案的比较:DOM,SAX,JDOM,DOM4J
- lpc2210之UART0、UART1基于UCOS的全双工通讯
- 新人报到
- oracle materialized view
- Android 开发环境的搭建
- Windows Mobile 数独游戏及全部源码
- asp.net相对路径的问题