社区
C语言
帖子详情
引用是否分配了内存
cowboy313
2004-10-08 10:32:36
声明一个引用时是否旬指针一样分配了内存,在钱能所编写的<<C++程序设计教程>>中提到,引用不是值,不占用存储空间. 在<<C++ Primer>>中提到,引用在内部存放的是一个对象的地址, 它是该对象的别名, 这就意味着引用分配有内存.
如果引用分配有内存,如何才能取得它自已的地址呢? 现在我们对引用取地址,得到的都是引用的目标的地址,这是说引用确实没有分配内存吗?
如有哪位知道请详细解说.
...全文
635
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就是一的引用,但是没有分配内存。
一叶还真不知秋
2004-10-09
打赏
举报
回复
plaumud的比喻非常恰当!严重支持!
fire314159
2004-10-09
打赏
举报
回复
只占用了一个空间记住你的别名(指针)。你名字的内涵还在那里。
playmud
2004-10-09
打赏
举报
回复
声明一个引用时是否旬指针一样分配了内存,在钱能所编写的<<C++程序设计教程>>中提到,引用不是值,不占用存储空间. 在<<C++ Primer>>中提到,引用在内部存放的是一个对象的地址, 它是该对象的别名, 这就意味着引用分配有内存.
-------------------------------------------------
比如你叫:张三
外号是:三疯
那么第一句话说的是:张三,三疯都是说的你,而你只有一个,所以说引用的对象不占用存储空间。
第二句话说的是,虽然你只有一个,但是你有两个名字,所以每一个名字在你的朋友的大脑里面
都占有记忆单元,所以说尽管你是一个人,但是朋友却要记2个名字,所以占用了空间。
crybigbaby
2004-10-09
打赏
举报
回复
需要4byte,这是指针占用的内存,但是不是在堆中,是在栈中
加载更多回复(5)
JVM对象创建与
内存
分配
机制深度剖析
本文深入剖析JVM对象创建与
内存
分配
机制。介绍对象创建的主要流程,包括类加载检查、
分配
内存
、初始化零值等步骤。阐述对象
内存
分配
方式,如栈上
分配
、Eden区
分配
等。还讲解了对象
内存
回收方法,如
引用
计数法、可达性分析算法,以及常见
引用
类型和判断对象与类
是否
存活的方法。
指针和
引用
是否
分配
存储单元的简易理解
本文探讨了C++中
引用
是否
占用存储空间的问题,并通过实例对比
引用
和指针在
内存
分配
及函数参数传递上的区别。
深入理解java虚拟机精华总结:如何判断对象
是否
可回收、
引用
、finalize、方法区回收、垃圾收集算法、垃圾收集器、
内存
分配
与回收策略
本文详细介绍了Java虚拟机中的对象可回收性判断,包括
引用
计数法和可达性分析法,以及四种
引用
类型。讨论了finalize方法的作用,方法区的回收策略,和多种垃圾收集算法,如标记-清除、标记-复制和标记-整理。此外,还涵盖了各种垃圾收集器,如Serial、ParallelScavenge、CMS和G1,并探讨了
内存
分配
与回收策略,特别是堆
内存
的分区和对象晋升规则。
对象并不一定都是在堆上
分配
内存
的。
通过逃逸分析,JIT编译器能分析对象
引用
的作用范围,决定对象
是否
可在栈上
分配
,而非一律
分配
在堆上,从而减少
内存
分配
压力。
引用
和指针傻傻分不清
引用
是C++特有的,它一旦初始化后不能改变,而指针可以改变所指的对象。
引用
不
分配
内存
,而指针有自身的
内存
。
引用
提供了一种更安全的方式,因为它们不能是NULL,并且在编译时就绑定到了对象。指针可以有多级,但
引用
只能有一级。使用
引用
可以提高代码效率,因为它无需检查
是否
为空。
C语言
70,038
社区成员
243,245
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章