引用在内存层面上的本质剖析—HJ-record12

在C++中,变量可分为三种类型,一种是值,一种是指针,剩下一种就是引用。从内存的角度来探讨一下这三个东西,看下面的代码,在内存中的情况:

分别设三种类型的变量,看它们在内存上的分布,在定义指针变量的时候,"int* p"还是"int *p"这两种写法都可以,但侯老师更偏向于前者,因为用前者的话,口语上说,p是一个变量,这样有助于理解。"int& r = x;",这种情况下,r就是个引用。对于指针和引用的说法也是有区别的,p是x的指针,我们说p是指向x的;r是x的引用,我们说r是代表x的。(所有的编译器,都是通过指针来实现引用的,但出于逻辑的角度,我们还是要把引用看成是一个整数)。

r代表x,x是什么,r就是什么。但仔细观察上图正r在内存中的描述,可以发现,存放r的内存位置有一个轻微的箭头指向x,这将引用在内存中的底部实现给描述出来的。

引用必须有初值,而且,初值设完了,不能再变了就!再看上面的一行:"r = x2;"这难道意味着引用的值变了?也不对,应该是,经过这行操作,x的值也变成了5,r的值也变成了5。引用不能变的意思是,引用与被引用的量是一体的,这俩不能改变,要改一起改。

编译器制造了一种假象:引用与被引用变量的大小相同地址也相同,本质就是通过一个指针给连起来了,同一个地址多了一个门牌号而已。

再看下面:

从这张图看,引用的真实大小究竟是多大,x和r的地址打印出来完全一样,x与r的大小打印出来也完全相同,当然,这都是编译器通过指针实现的"假象"。

一句话讲的好:引用就是一种漂亮的指针。引用多用在参数传递上:

在以上func三种传递形式,第二种是比较容易理解和接受的,但传递速度太慢,所以,一般情况下,都要用第三种,传引用的方式来传递。

传引用和传值不能同时存在,因为二者的签名是一致的,如果这两个被视为相同的话,就麻烦大了,就会被编译器被视为同名函数,编译器就不知道到底该调用谁了。而且,在这个例子中,灰色部分是应该加const的。并且,加了的const,也是函数前面的一部分。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值