用汇编的眼光看C++(之拷贝、赋值函数)
来源:互联网 发布:淘宝会员数量 编辑:程序博客网 时间:2024/05/17 02:07
那么我们在如下的函数里面进行调用的时候,调用的函数分别是哪些呢?
其实汇编的结果是这样的,大家可以一起看一下,自己尝试读一下。如果一次不是很明白,可以多读几次。 代码有点长,大家可以一句一句来看,比如说就按照70、71、72、73分别查看对应的汇编代码:(1)70句: 我们看到函数做了两次函数调用,恰好就是apple的构造函数调用。这也正好对应着两个临时变量a和c,两个变量的地址分别是【ebp-10】和【ebp-14】,这里也可以看出整个类的大小就是4个字节,就是一块存放数据的普通内存。而构造函数之所以能和对应的内存绑定在一起,主要是因为ecx记录了内存的起始地址,这在C++编译中是十分关键的。我们看到的C++构造函数好像是没有绑定内存,实际上在VC里面已经做好了约定,ecx就是this指针,就是类的内存起始地址。有兴趣的同学看看G++编译的时候,采用的this指针是哪个寄存器保存的?(其实是eax)
(2)71句:通过对应看到了eax记录了引用变量的地址,而ecx是ebp下面紧挨着四个字节。但是函数调用的地址和前面的缺省构造函数不太一样,所以我们大胆猜测,这里的构造函数这是拷贝构造函数,我们可以在调试的时候查看一下打印消息。
(3)72句:0x4012AF语句已经清楚地告诉了我们,这里调用的函数就是operator=函数,这一部分是算术符重载的内容,我们在后面的博客会重点介绍。
(4)73句: 前面我们讲过,析构函数在函数调用结束的时候被被自动调用,那么这里我们看到却是出现了三个调用?这三个变量正好是我们之前说的a、b、c三个变量。那么这三个变量调用的次序是怎样的呢?我们可以查看一下变量的地址,分别是【ebp-18h】、【ebp-14h】、【ebp-10h】,这正好和变量出现的顺序相反。所以我们看到,析构函数和构造函数是严格一一对应的,谁先出现,谁后析构。
【预告: 下面的博客我们会对构造、析构中出现的一些现象进行总结】
- 用汇编的眼光看C++(之class构造、析构) ,(之拷贝、赋值函数)
- 用汇编的眼光看C++(之拷贝、赋值函数)
- 用汇编的眼光看C++(之拷贝、赋值函数)
- 用汇编的眼光看C++(之拷贝、赋值函数)
- 用汇编的眼光看C++(之拷贝、赋值函数)
- 用汇编的眼光看C++(之拷贝、赋值函数)
- 用汇编的眼光看C++(之拷贝、赋值函数)
- 用汇编的眼光看C++(之特殊函数)
- 用汇编的眼光看C++(之虚函数)
- 用汇编的眼光看c++(之模板函数)
- 用汇编的眼光看c++(之模板函数)
- 用汇编的眼光看C++(之特殊函数)
- 用汇编的眼光看C++(之虚函数)
- 用汇编的眼光看c++(之模板函数)
- 用汇编的眼光看C++(之特殊函数)
- 用汇编的眼光看C++(之特殊函数)
- 用汇编的眼光看C++(之虚函数)
- 用汇编的眼光看c++(之模板函数)
- Java中的overload和override的区别
- 初学Qt:QLineEdit设置为不可编辑
- 习题3(3.2)
- 信息学奥赛一本通(C++版) 第三部分 数据结构 第一章 栈
- linux c 预处理和结构体
- 用汇编的眼光看C++(之拷贝、赋值函数)
- linux学习之查看linux系统
- 51nod1596-二进制&输入挂-搬货物
- 如何通过 USB 设备来安装 CentOS
- Transaction
- 最基本的快速幂
- 数据库笔试题
- gets() fgets()
- Android编程权威指南笔记2:解决R文件爆红问题和SDK概念