第六章 总结
引用,实际上是C++为了简化指针操作,对指针的操作进行了封装,产生了引用类型。实际上引用类型就是指针类型,只不过它用于存放地址的内存空间对使用者而言是隐藏的,而且对引用的任何操作都会被重定向到其指向的变量。
一句话,引用是一种特殊指针。
参数传递:参数传递时候,必然会发生从实参到形参的拷贝。其中:
·普通值做参数时,直接拷贝值从实参到栈上作为形参;
·指针做参数时,拷贝的是指针变量中的值,也就是其指向的变量的地址;
·引用做参数时,拷贝的是其指向的变量的地址;
·浮点数做参数时,拷贝其值到栈上,中间采用浮点指令完成;
·数组做参数时,拷贝的是数组首地址,也是作地址用;
·结构体和类做参数时,若无自定义拷贝构造函数,则依次拷贝对象域内的数据到形参(默认拷贝构造),若有自定义的拷贝构造函数,则调用构造函数在栈上构造形参。
返回值:
·普通值做返回值时,直接用eax返回;
·指针做返回值时,用eax返回指针值;
·引用做返回值时,用eax返回其指向的变量的地址,同指针;
·浮点数做返回值时,将返回值存储到浮点数栈的栈顶,也就是ST0做返回值;
·数组做返回值时,用eax返回其数组的首地址,同指针;
·结构体和类做返回对象时,
若无自定义的拷贝构造函数,
1.对象大小不大于(<=)4字节,直接用eax返回;
2.对象大小大于(>)4字节,且不大于(<=)8字节,用eax和edx返回;
若存在自定义的拷贝构造函数或赋值操作符重载,或者无自定义的拷贝构造函数和赋值操作符重载但对象大小大于(>)8字节时,则隐含传入一个返回对象(可能是临时对象或者接收对象)的地址,在函数内部,对该临时对象的各成员依次赋值(默认拷贝构造),eax返回临时对象的地址。
当返回对象被用作拷贝构造的参数去构造新对象时,直接把新对象的地址做返回对象;
当返回对象被用作assignment操作时,需要生成一个临时对象去过渡,该临时对象会被作为返回对象。
本系列结尾:
本系列文章中的重要分析部分都在反汇编代码后面的注释上,而且重点的理解也要结合代码调试去完成。
总之,实践才是检验真理的唯一标准。
作者署名:cr09philip
参考文献:钱林松《C++反汇编与逆向分析技术揭秘》