探讨c++函数中的参数传递与返回值(六) 总结

第六章 总结

引用,实际上是C++为了简化指针操作,对指针的操作进行了封装,产生了引用类型。实际上引用类型就是指针类型,只不过它用于存放地址的内存空间对使用者而言是隐藏的,而且对引用的任何操作都会被重定向到其指向的变量。

    一句话,引用是一种特殊指针。

参数传递:参数传递时候,必然会发生从实参到形参的拷贝。其中:

·普通值做参数时,直接拷贝值从实参到栈上作为形参;

·指针做参数时,拷贝的是指针变量中的值,也就是其指向的变量的地址;

·引用做参数时,拷贝的是其指向的变量的地址;

·浮点数做参数时,拷贝其值到栈上,中间采用浮点指令完成;

·数组做参数时,拷贝的是数组首地址,也是作地址用;

·结构体和类做参数时,若无自定义拷贝构造函数,则依次拷贝对象域内的数据到形参(默认拷贝构造),若有自定义的拷贝构造函数,则调用构造函数在栈上构造形参。

返回值:

·普通值做返回值时,直接用eax返回;

·指针做返回值时,用eax返回指针值;

·引用做返回值时,用eax返回其指向的变量的地址,同指针;

·浮点数做返回值时,将返回值存储到浮点数栈的栈顶,也就是ST0做返回值;

·数组做返回值时,用eax返回其数组的首地址,同指针;

·结构体和类做返回对象时,

         若无自定义的拷贝构造函数,

1.对象大小不大于(<=)4字节,直接用eax返回;

                   2.对象大小大于(>)4字节,且不大于(<=)8字节,用eax和edx返回;

若存在自定义的拷贝构造函数或赋值操作符重载,或者无自定义的拷贝构造函数和赋值操作符重载但对象大小大于(>)8字节时,则隐含传入一个返回对象(可能是临时对象或者接收对象)的地址,在函数内部,对该临时对象的各成员依次赋值(默认拷贝构造),eax返回临时对象的地址。

         当返回对象被用作拷贝构造的参数去构造新对象时,直接把新对象的地址做返回对象;

当返回对象被用作assignment操作时,需要生成一个临时对象去过渡,该临时对象会被作为返回对象。


本系列结尾:

本系列文章中的重要分析部分都在反汇编代码后面的注释上,而且重点的理解也要结合代码调试去完成。

总之,实践才是检验真理的唯一标准。

作者署名:cr09philip

参考文献:钱林松《C++反汇编与逆向分析技术揭秘》


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值