引用是否分配了内存

cowboy313 2004-10-08 10:32:36
声明一个引用时是否旬指针一样分配了内存,在钱能所编写的<<C++程序设计教程>>中提到,引用不是值,不占用存储空间. 在<<C++ Primer>>中提到,引用在内部存放的是一个对象的地址, 它是该对象的别名, 这就意味着引用分配有内存.
如果引用分配有内存,如何才能取得它自已的地址呢? 现在我们对引用取地址,得到的都是引用的目标的地址,这是说引用确实没有分配内存吗?
如有哪位知道请详细解说.
...全文
514 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
prozax 2004-10-10
  • 打赏
  • 举报
回复
引用是在内部存放的是一个对象的地址,但一般引用可以在编译时候完全去掉,所以可以说它没有分配内存。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
拜托你不要瞎说 看看我上面的帖子里的汇编码~~
wangxiaoxiao2000 2004-10-10
  • 打赏
  • 举报
回复
引用不过是取得一个对象或变量的地址
进而获得整个对象的控制权
没有分配地址
挺拔的劲松 2004-10-10
  • 打赏
  • 举报
回复
引用是在内部存放的是一个对象的地址,但一般引用可以在编译时候完全去掉,所以可以说它没有分配内存。
prozax 2004-10-10
  • 打赏
  • 举报
回复
int a = 100;
mov dword ptr [ebp-4],64h//将100存进a
int &r = a;
0040157F lea eax,[ebp-4]//取a的地址
00401582 mov dword ptr [ebp-8],eax//将a的地址存进r

7: cout << &a <<" " << &r <<"\n";
00401585 push offset string "\n" (0046c020)
0040158A mov ecx,dword ptr [ebp-8]//读取r(而不是读取r的地址)
0040158D push ecx//输出
0040158E push offset string " " (0046c01c)
00401593 lea edx,[ebp-4]//取a的地址
00401596 push edx//输出
00401597 mov ecx,offset std::cout (004777e0)

看到了吧 所谓别名实质上是个指针 但和指针不同的地方在于
编译器隐式的作了一些操作 比如 &r 并不是取r的地址 而是直接输出r的值
hoho~~ 给分给分
sharkhuang 2004-10-10
  • 打赏
  • 举报
回复
引用的实现就是const指针。所以有分配内存
blackcrusoe 2004-10-10
  • 打赏
  • 举报
回复
我觉得这个问题答案不一定:有些引用可以在编译时候完全去掉,也就是说这些引用只是写给人看的,好的编译器可以完全把它优化掉,实际运行的程序中并没有它们的影子;另外一些,由于种种原因不能在编译时优化掉,那么就可能采用一些手段来实现,但具体的手段要看编译器(因为C++标准中并没有规定),但大多都是用指针实现的(more effective c++中有所述及),所以最好不要对引用占用的内存做假设,因为很可能是不可移植的。
cowboy313 2004-10-10
  • 打赏
  • 举报
回复
本贴问题讨论到此结束, 谢谢大家支持.
结论:
引用分配有内存,相当于常指针.在分析程序时,应按没有分配内存理解.在画内存图解时,应画出引用的地址.
StanLippman 2004-10-09
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

int main(){
int a = 100;
int &r = a;
cout << &a <<" " << &r <<"\n";
int aa,rr;
__asm{
mov eax,a
mov aa,eax
mov eax,r
mov rr,eax
}
cout << aa << " " << rr << "\n";
return 0;
}

看了就懂了
doolin 2004-10-09
  • 打赏
  • 举报
回复
<<深度探索C++对象模型>>中说了,引用和指针一样,占有一个WORD的内存,对32位机来说,就是4个字节.
elvahuang 2004-10-09
  • 打赏
  • 举报
回复
也是分配4byte
elvahuang 2004-10-09
  • 打赏
  • 举报
回复
当然要分配内存
引用其实就是包装后的指针
ming6 2004-10-09
  • 打赏
  • 举报
回复
那引用到底存在哪里?
turlim 2004-10-09
  • 打赏
  • 举报
回复
一个地址本身也是占内存的,只是它指向的东西不用再复制一次了。
cowboy313 2004-10-09
  • 打赏
  • 举报
回复
钱能所编写的<<C++程序设计教程>>中第187页提到,C++没有提供访问引用本身地址的方法,因为它与指针或其他变量的地址不同,它没有任何意义. 在本书的P193页中的关于引用的几个内存布局方式的图解也说明了引用确实分配有内存.
我认为引用确实象指针一样分配了一个四字节的内存,但是我们应该按照没有分配内存来理解.
在程序
# include <iostream.h>

class A
{
protected:
int a;
int &b;
};

void main()
{
cout<<sizeof(A)<<endl;
}中, 输出是8,确定引用分配有内存,注释int &b后输出是4.



在程序
# include <iostream.h>

void main()
{
double a;

double& b=a;

cout<<sizeof(b)<<endl;
}
中输出的是8,其实是引用所指向目标的大小.

故本人认为引用确实分配有内存,具体理解的时候还是有一定的麻烦.
kobefly 2004-10-09
  • 打赏
  • 举报
回复
plaumud
说得太好了
就是说引用是一个地址
但这个地址也是要存在,存在就要占地方,就像指针一样
但是引用的东西是不变得
不会制作副本
还是原来得东西,在原地啊
daylove 2004-10-09
  • 打赏
  • 举报
回复
给分吧,

int i=23;
int & j=i;

现在j就是一的引用,但是没有分配内存。
  • 打赏
  • 举报
回复
plaumud的比喻非常恰当!严重支持!
fire314159 2004-10-09
  • 打赏
  • 举报
回复
只占用了一个空间记住你的别名(指针)。你名字的内涵还在那里。
playmud 2004-10-09
  • 打赏
  • 举报
回复
声明一个引用时是否旬指针一样分配了内存,在钱能所编写的<<C++程序设计教程>>中提到,引用不是值,不占用存储空间. 在<<C++ Primer>>中提到,引用在内部存放的是一个对象的地址, 它是该对象的别名, 这就意味着引用分配有内存.
-------------------------------------------------
比如你叫:张三
外号是:三疯
那么第一句话说的是:张三,三疯都是说的你,而你只有一个,所以说引用的对象不占用存储空间。
第二句话说的是,虽然你只有一个,但是你有两个名字,所以每一个名字在你的朋友的大脑里面
都占有记忆单元,所以说尽管你是一个人,但是朋友却要记2个名字,所以占用了空间。
crybigbaby 2004-10-09
  • 打赏
  • 举报
回复
需要4byte,这是指针占用的内存,但是不是在堆中,是在栈中
加载更多回复(5)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧