C++中的引用变量在内存中存放的位置


这几天一直在思考一些问题,就是引用变量在一些教材上的说法是一个变量的别名,那么引用变量本身是否占用空间呢?

比如说:(本人使用的是vc++6.0编译器)

int a = 10;

int & r = a;

cout << &a << endl;

cout << &r << endl;

从上面的例子当中可以看出:它们得出的结果是相同的,这时便会有人说,ra所占用的内存空间是相同的,因为打印出来的地址是相同的。所以这些教材上对于引用变量的操作,称之为声明一个引用变量,而非定义。因为教材的编写者认为引用变量并不占用空间。

但是,如果你使用调试器调试一下,看一下汇编的代码,就会产生新的迷惑了。

00401040   push        ebp
00401041   mov         ebp,esp
00401043   sub         esp,48h
00401046   push        ebx
00401047   push        esi
00401048   push        edi
00401049   lea         edi,[ebp-48h]
0040104C   mov         ecx,12h
00401051   mov         eax,0CCCCCCCCh
00401056   rep stos    dword ptr [edi]

5:        int a = 10;
00401058   mov         dword ptr [ebp-4],0Ah
6:        int & r = a;
0040105F   lea         eax,[ebp-4]
00401062   mov         dword ptr [ebp-8],eax

 

从这段汇编代码来看,ra的空间并不相同,那这又怎么解释呢?

 

基于此,我得出了一个非常合理的解释:

    如果定义(我认为引用变量占用空间,故称之为定义)一个引用变量,这个时候引用变量实际上在内存中已经申请了一个空间,是4个字节的(32bit系统中),它本身和指针是相同的。也就是说引用和指针对于编译器本身来说操作是相同的,只是对于用户来说操作不同而已。

    

接下来又会有人问:那么为什么上面程序的结果打印出来的地址是相同的呢?

    其实这只是编译器给你的假象而已。当你将r引用给了a,当想要打印&r的时候,编译器会自动将其引用的对象的地址打印出来,也就是将a的地址打印出来,这也就是它们打印结果相同的原因了。

 

注:以上的解释都是本人的研究结果,并没有经过官方的证实,如果哪为网友对此有新的看法,不吝赐教,非常感谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值