社区
C语言
帖子详情
引用是否分配了内存
cowboy313
2004-10-08 10:32:36
声明一个引用时是否旬指针一样分配了内存,在钱能所编写的<<C++程序设计教程>>中提到,引用不是值,不占用存储空间. 在<<C++ Primer>>中提到,引用在内部存放的是一个对象的地址, 它是该对象的别名, 这就意味着引用分配有内存.
如果引用分配有内存,如何才能取得它自已的地址呢? 现在我们对引用取地址,得到的都是引用的目标的地址,这是说引用确实没有分配内存吗?
如有哪位知道请详细解说.
...全文
565
25
打赏
收藏
引用是否分配了内存
声明一个引用时是否旬指针一样分配了内存,在钱能所编写的<>中提到,引用不是值,不占用存储空间. 在<>中提到,引用在内部存放的是一个对象的地址, 它是该对象的别名, 这就意味着引用分配有内存. 如果引用分配有内存,如何才能取得它自已的地址呢? 现在我们对引用取地址,得到的都是引用的目标的地址,这是说引用确实没有分配内存吗? 如有哪位知道请详细解说.
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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就是一的引用,但是没有分配内存。
一叶还真不知秋
2004-10-09
打赏
举报
回复
plaumud的比喻非常恰当!严重支持!
fire314159
2004-10-09
打赏
举报
回复
只占用了一个空间记住你的别名(指针)。你名字的内涵还在那里。
playmud
2004-10-09
打赏
举报
回复
声明一个引用时是否旬指针一样分配了内存,在钱能所编写的<<C++程序设计教程>>中提到,引用不是值,不占用存储空间. 在<<C++ Primer>>中提到,引用在内部存放的是一个对象的地址, 它是该对象的别名, 这就意味着引用分配有内存.
-------------------------------------------------
比如你叫:张三
外号是:三疯
那么第一句话说的是:张三,三疯都是说的你,而你只有一个,所以说引用的对象不占用存储空间。
第二句话说的是,虽然你只有一个,但是你有两个名字,所以每一个名字在你的朋友的大脑里面
都占有记忆单元,所以说尽管你是一个人,但是朋友却要记2个名字,所以占用了空间。
crybigbaby
2004-10-09
打赏
举报
回复
需要4byte,这是指针占用的内存,但是不是在堆中,是在栈中
加载更多回复(5)
内存
泄露Demo leaky app
内存
泄露Demo leaky app
C/C++指针经典资料大全
C/C++指针经典资料大全,十余部经典资料书籍,是您精通C指针的理想教程。
c++中
引用
面试点7连问以及
引用
真的不
分配
内存
吗
本篇文章从面试官的口吻连问7个
引用
有关的问题,并且从汇编的层面上对
引用
进行深入分析,让你充分理解
引用
的概念和原理。 首先还是看一下思维导图: 1.
引用
的背景和概念 说到
引用
,首先要说一下’&'标识符,其实c语言中这个符号只是用来取地址的,并没有
引用
的概念,直到c++对这个标识符的作用进行了扩充,才有了
引用
这个概念。 所谓
引用
,其实就是给变量取了一个别名,一个简单的例子如下: int main() { int a = 2; int &b = a; return 0; } 对于这段c
C++中的指针与
引用
以及动态
内存
分配
C++中的指针与
引用
以及动态
内存
分配
对于C语言和C++来说,最重要的一个内容就是指针。使用指针能够让我们实现对
内存
的高效利用,提高程序的效率,但是很多埋藏的很深的Bug都和指针有关,因此如果想要很好的使用指针首先需要对指针具有深入的了解 同时在C语言中,我们通常结合stdlib.h头文件中的malloc和calloc函数来实现指针的高效存取。但是在C++中,我们可以直接使用关键字new和delete来实现动态
内存
的
分配
而不需要使用上面的两个函数。 此外,C++中还具有C语言所不具有
引用
特性,因此本章讲解的
基本数据类型和
引用
数据类型在
内存
中的
分配
基本数据类型
引用
数据类型 在栈中进行
分配
在堆中进行
分配
,堆的读写速度远不及栈 变量名指向具体的数值 变量名指向存数据对象的
内存
地址,即变量名指向hash值 变量在声明之后java就会立刻
分配
给他
内存
空间 它以特殊的方式(类似C指针)指向对象实体(具体的值),这类变量声明时不会
分配
内存
,只是存储了一个
内存
地址 基本类型之间的赋值是创建新的拷贝 对象之间的赋值只是传递
引用
“==”和“!=”是在比较值 “==”和“!=”是在比较两个
引用
是否
相同,需要自
C语言
70,026
社区成员
243,244
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章