首页 > 科技 > 正文

深入理解C++——引用传递
2019-09-14 06:20:06   来源:东方头条   

引用传递,是C++非常重要的特性。引用传递能够将变量或对象本身作为参数传递,而不是复制一份副本后,传递副本。

引用传递的主要作用有二:

第一,函数内部可修改变量或对象。函数返回后,函数调用者得到的也是被修改后的值。常见场景:① 函数需要返回多个值,由于return只能返回一个值,因此可以将其他值以引用传递的形式修改。② 控制递归过程,可以令参数为引用传递,每次递归执行函数体,就会修改参数,当参数等于某个值时递归结束。

第二,也是最重要的作用,引用传递可以避免对象传递时的复制构造。如果函数参数是对象,且采用值传递,则从调用者传到被调函数的参数,需要调用一次复制构造函数。如果这个对象很大,复制构造的开销就会很高。反观引用传递,它传递对象本身,可以完美规避复制构造的过程,极大减少时空开销。最后,如果不希望函数体更改引用传递的对象,则应在对象参数前加const限定,即const引用传递,如下图,这也是参数传递中最常见的形式。

顺带一提,函数返回对象时,还会进行两次复制构造:先将返回的对象复制到临时空间,这是第一次复制构造;而后释放函数所占空间;最后将临时空间的对象复制到调用者的对象,这是第二次复制构造。这个过程复制构造的代价甚至超过了参数值传递。那么,能否也使用引用传递避免复制构造呢?当然可以,不过这就需要用到C++11最重要的新特性——右值引用。右值引用非常复杂,这里不展开,后面有时间再详细讲解。

既然引用传递这么好,是不是说,只要函数体内不会更改变量值,我们都可以使用引用传递替代值传递呢?回答这个问题之前,我们需要先了解引用传递底层的实现机制。看下面两个函数:

第一个函数是引用传递,而第二个函数,实际上是编译器对第一个函数进行解释的结果。也就是说,引用传递,底层是用一个指针实现的,该指针不可指向其他变量,但指针所指内容可以修改(记不清const和指针关系的,赶紧去补课...)在第一个函数中所有对n的操作,会被翻译为第二个函数中对*ptr_n的操作,二者完全等价。也就是说,C++的引用传递,底层是用指针实现,在传递时会产生一个指针变量的开销。

那么问题来了,对于我们现在普遍使用的64位机,指针变量占空间是8字节。而所有基本类型中,除了极少使用的long double外,其余长度都小于等于8字节。因此,如果参数是基本类型,引用传递反而比值传递产生了更大的内存开销!因此,如果传递的是基本数据类型,则值传递一般优于引用传递。

总结:如果是传递对象,引用传递可以避免复制构造带来的大量开销,推荐使用;如果是传递基本数据类型,引用传递反而不如值传递。

相关热词搜索:传递 理解 引用

上一篇:超光速就能回到过去?爱因斯坦:不仅能回去,还能窥探过去的一切
下一篇:最后一页

泰安知名律师   电话:18053115917
手机:0531-80961678   微信:18053115917   QQ:709581498   邮箱:709581498@qq.com
网站地图 (XML地图 / 百度地图