引用的本质

 

首先,鄙人也是正在学习中的学生,不敢说深入彻底的理解了引用的本质。只是略有深度而已,请大家参考,也是督促自己深入理解一下引用。

老话:不喜勿喷哈,如有错误,敬请批评指正。大笑

进入正题:

引用:老师一定都讲过,引用是变量的别名,如:


引用的本质,其实就是一个指针,一个const类型的指针:


我们总是会说的引用是一个别名,不占用内存空间。此话应该说是半对。网上有句经典的话说:你可以拥有引用,但编译器仅仅拥有地址。所以实际上当定义了一个引用同时初始化之后,并没有为变量的这个别名分配空间。所以你在调试的时候会看到这样的画面,你会觉得,引用真的只是一个别名,它和a是一样的。真的没有占内存。


然而对于编译器及编译后而言,它不会再管别名还是变量名,它只认地址。对于经过编译之后生成的代码而言,没有变量名这一说。且看反汇编:


第一句语句的意思是:把0Ah(十六进制表示,即十进制的10)写入以a为地址的内存区域。

第二句语句的意思是:把a作为地址存入eax寄存器中。

第三句语句的意思是:把eax寄存器中的内容写入以p为地址的内存区域。

/*eax中存放的可是一个地址啊。把一个地址放进一块内存空间,这让你想到了什么?对,指针!*/

那么就是说:

引用在底层,实际是将所要引用的变量的地址放进了另一个内存区域中,也就是将变量的地址赋给了一个指针变量。。。这就是引用的实质。

只不过,特别的地方在于,存放变量地址的这个指针变量被const修饰:决定了这个指针是一个常指针。并且并没有为这个别名开辟空间,所以你在内存看到的是两个相同的地址。你就以为引用真的只是别名,真的不开辟空间了。

引用被翻译成了指针(也就是说它在本质上就是一个指针),是一个常量指针,这个指针恒定的指向了一个变量的空间。所以,引用实则也占用内存空间,在32位机上,占用了4个字节。说引用是变量的别名,只是在语言层面上的一种理解方式。




  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值