Chinaunix首页 | 论坛 | 博客
  • 博客访问: 42261
  • 博文数量: 9
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 94
  • 用 户 组: 普通用户
  • 注册时间: 2014-09-10 11:35
文章分类

全部博文(9)

文章存档

2015年(1)

2014年(8)

我的朋友

分类: C/C++

2014-09-29 00:25:24

比如说:(本人使用的是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的地址打印出来,这也就是它们打印结果相同的原因了。

参考:http://www.cnblogs.com/rollenholt/articles/2070661.html
    http://blog.csdn.net/gmcxsqjh/article/details/3719552

阅读(1179) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~