C++-C++中的引用是否占据内存?

C++-C++中的引用是否占据内存?

清晨说ぺ晚安 发布于 2017-11-07 字数 85 浏览 1816 回复 10

引用会占用内存空间吗?引用只是一个别名,应该不占内存,可是在内存中如何体现呢?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(10

泛泛之交 2017-11-11 10 楼

int a = 10;

int & r = a;

cout << &a << endl;

cout << &r << endl;

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

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

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

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

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

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

归属感 2017-11-10 9 楼

具体情况具体分析,看什么地方的引用了。

灵芸 2017-11-10 8 楼

按照C++标准来说,引用是不占内存的,但是真的不占内存吗,他需要一个标志来定义和某一个指向同样的内存,大多数人都会说仅仅是个别名,别名也是需要占用地方的,不过这个问题不需要纠结,因为没有意义,大家都不会考虑引用的内存的。

晚风撩人 2017-11-09 7 楼

这个问题不需要太关注了。

说占用内存也对,说不占用内存也不错。引用只是C++的语法糖而已,标准里面并没有规定引用是否占据内存,不过各个编译器实现引用的处理策略大抵相同,底层通过指针实现,但是在代码书写过程中不应该依赖于这个特点,因为底层通过指针实现并不是C++标准里规定的。

不过考虑到引用的特性@c++指针和引用的所有区别?:生命周期中只初始化一次,引用的处理完全可以在编译期完成,经过优化后也就不需要占用内存。

夜无邪 2017-11-09 6 楼

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

灵芸 2017-11-09 5 楼

作为变量、常量、空语句、都会在编译后占用空间,从这点上看,同一变量的多次使用也是要占用内存的。
但是引用在编译以后直接以被引用的对象进行操作,其所占空间就是原对象所占空间,并没有“额外”的添加空间来保存对象、因此可以说是不占内存空间。

只能说引用占用内存只是暂时的,更托!

想挽留 2017-11-08 4 楼

这个先前了解到的是不占用内存空间的,因为传过去的就是当前变量的地址,引用本质上和指针差不多,编译好后,引用就没了

灵芸 2017-11-08 3 楼

由于引用本身就是目标的一个别名,引用本身的地址是一个没有意义的值,所以在c++中是无法取得引用的内存地址的。取引用的地址就是取目标的地址,c++本身就根本不提供获取引用内存地址的方法。

想挽留 2017-11-08 2 楼

引用就是个别名,不一定占用运行时的内存。是否占用编译器可以根据实际情况来处理。比如:

int a = 0;
int& b = a;

在这种情况下,编译器完全可以把a和b等同起来,虽然名字有两个,内存却只分配一份int,除此之外,也没有指针。结果不管你用哪个名字,访问的都是同一变量。

想挽留 2017-11-07 1 楼

我举个例子吧:
someObject a;
&b=a;
现在问b的地址是多少?
我觉的这个问题和上面的的问题有点类似,其实b是占用的,只是编译器的实现使得我们无法得到b的地址而已。b其实就是一个变量。