引用不占存储空间??

ycxucqu 2009-06-04 10:31:15
都说引用不占存储空间,可是这句话我不太理解,下面是我的一个测试例子:
int ia =1;
int &ib = ia ;
int ic = 2 ;
printf("%p\n",&ia) ;
printf("%p\n",&ib) ;
printf("%p\n",&ic) ;
可是输出的是:
0012FF64
0012FF64
0012FF5C
也就是ia和ic之间隔了8个字节,这不说明引用ib也占了内存空间吗??如果不占内存空间,ia,ic之间不是应该只隔4字节的吗?
请高人指点~
...全文
557 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
heling2008 2009-06-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zsjsgyy 的回复:]
引用和指针一样
一般占4个字节(和int一样)
引用其实就是加了一些限制的指针
[/Quote]

说的很对,不是前提是在32位系统中。
lee673 2009-06-04
  • 打赏
  • 举报
回复
你吧int ic = 2 ;放在 int &ib = ia ;前面在试一下就知道了。。。。。。
机智的呆呆 2009-06-04
  • 打赏
  • 举报
回复
c++没有规定引用的底层实现,所以编译器实现时,可以为引用分配空间,也可以不分配空间~~~
最近有个帖子讨论过,lz可以翻出看看
zsjsgyy 2009-06-04
  • 打赏
  • 举报
回复
引用和指针一样
一般占4个字节(和int一样)
引用其实就是加了一些限制的指针
lylm 2009-06-04
  • 打赏
  • 举报
回复
同意2楼,这个例子引用占了4个字节
GS_Neo 2009-06-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 chenzhp 的回复:]
那是说引用不会为其指向的某个对象重新分配一个地址,并不代表引用本身不占空间
[/Quote]
UP,楼上说的很对,引用本身也属于指针,是指针就得占8个字节。
chenzhp 2009-06-04
  • 打赏
  • 举报
回复
那是说引用不会为其指向的某个对象重新分配一个地址,并不代表引用本身不占空间
wangyadong 2009-06-04
  • 打赏
  • 举报
回复
引用也是变量啊,那就会占用内存啊
ycxucqu 2009-06-04
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 yejinson 的回复:]
引用 2 楼 chenzhp 的回复:
那是说引用不会为其指向的某个对象重新分配一个地址,并不代表引用本身不占空间


说得对
[/Quote]
有没有具体点的解释啊?引用不会为其指向的某个对象重新分配一个地址?那其余类型是要为指向的对象重新分配地址了?那栈分配的内存拿来有什么用?
yejinson 2009-06-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 chenzhp 的回复:]
那是说引用不会为其指向的某个对象重新分配一个地址,并不代表引用本身不占空间
[/Quote]
说得对
ycxucqu 2009-06-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wangyadong 的回复:]
引用也是变量啊,那就会占用内存啊
[/Quote]
那引用不占存储空间是什么意思啊?
小猪头是猪 2009-06-04
  • 打赏
  • 举报
回复
引用相当于:
一个人叫姓名叫:张三
别名叫三娃
那个三娃就是引用
三娃本来是不占空间的
但是他指向张三 张三是占用空间的
所以引用就是这么回事情
你画图看看就知道了
cxlong89 2009-06-04
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 linyt 的回复:]
引用 13 楼 lqcharles 的回复:
引用可以认为是一个别名,这样理解就清楚了


赞同。

引用 6 楼 Demon__Hunter 的回复:
c++没有规定引用的底层实现,所以编译器实现时,可以为引用分配空间,也可以不分配空间~~~
最近有个帖子讨论过,lz可以翻出看看


的确如此。

引用是在汇编代码中是如何实现的,这要看编译器的实现,不过大数多编译器用指针来实现。但并不代码会为它分配空间。

以下面程序为例


[/Quote]
学习了。3Q
海枫 2009-06-04
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 lqcharles 的回复:]
引用可以认为是一个别名,这样理解就清楚了
[/Quote]

赞同。

[Quote=引用 6 楼 Demon__Hunter 的回复:]
c++没有规定引用的底层实现,所以编译器实现时,可以为引用分配空间,也可以不分配空间~~~
最近有个帖子讨论过,lz可以翻出看看
[/Quote]

的确如此。

引用是在汇编代码中是如何实现的,这要看编译器的实现,不过大数多编译器用指针来实现。但并不代码会为它分配空间。

以下面程序为例


int ia =1;
int &ib = ia ;
int ic = 2 ;
printf("%p\n",&ia) ;
printf("%p\n",&ib) ;
printf("%p\n",&ic) ;


经编译器后,可以转换成如下的代码:


int ia =1;
int *ib = &ia ; //ib由引用变成指针
int ic = 2 ;
printf("%p\n",&ia) ;
printf("%p\n",ib) ; //引用取地址=>指针本身就是地址
printf("%p\n",&ic) ;


这里为ib分配了一个空间,但由ib这个指针很特殊,在定义的时候一定要有初始化,这就为它的优化提供了很好的依据。
上面的代码完全可以变成下面这样:


int ia =1;
//int &ib = ia ; 编译只需记住ib是ia的引用,不需要分配空间
int ic = 2 ;
printf("%p\n",&ia) ;
printf("%p\n",&ia) ; //原来是printf("%p\n",&ib) ;ib即ia(引用定义),故直接用ia来替换
printf("%p\n",&ic) ;


最后这个代码就没有为引用分配空间…… 如果标准没有规定这些行为,不同的编译器会有不同的行为。

china_west 2009-06-04
  • 打赏
  • 举报
回复 1
他的空間不一定是連續的
lqcharles 2009-06-04
  • 打赏
  • 举报
回复
引用可以认为是一个别名,这样理解就清楚了
ycxucqu 2009-06-04
  • 打赏
  • 举报
回复
那引用本身分配的空间用来存什么东西的?
还有如果是指针int *pb=&a;那就要为a再重新分配一个地址吗?
KevinHo 2009-06-04
  • 打赏
  • 举报
回复
引用当然也要占空间,虽然是变量的别名,因为它也是变量啊
K_s_G 2009-06-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zsjsgyy 的回复:]
引用和指针一样
一般占4个字节(和int一样)
引用其实就是加了一些限制的指针
[/Quote]
?
ycxucqu 2009-06-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 chenzhp 的回复:]
那是说引用不会为其指向的某个对象重新分配一个地址,并不代表引用本身不占空间
[/Quote]
那引用本身分配的空间用来存什么东西的?
还有如果是指针int *pb=&a;那就要为a再重新分配一个地址吗?

69,379

社区成员

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

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