引用在内存层面上的本质剖析—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,也是函数前面的一部分。

发布了271 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_17846375/article/details/104646621