引用是否分配内存空间?

wpalhm 2007-12-01 07:22:30
一个关于引用的例子:

#include <iostream>
#include <string>
using namespace std;

float c;
float& test(float,float);
void main(int argc,char* argv[])
{
float &pn=test(3.0f,1.2f);
cout<<pn;
cin.get();
}

float &test(float a,float b)
{
c=a*b;
return c;
}

这种情况同样也不产生临时变量,可读和性能都很好,但有一点容易弄错,就是当c是非main的局部变量或者是在堆内存中临时开辟后来又被fee掉了以后的区域,这种情况和返回的指针是局部指针的后果一样严重,会导致引用指向了一个不明确的地址,这种情况在内存中情况见下图:
在这里 float &pn = test(3.0f, 1.2f);这里发fn是否会去申请另外一个栈空间。还是fn本身都不会去申请空间就直接是c所指向的地址?
说白了就是引用会去声请空间吗?

...全文
1627 50 打赏 收藏 转发到动态 举报
写回复
用AI写文章
50 条回复
切换为时间正序
请发表友善的回复…
发表回复
qulipx 2011-06-29
  • 打赏
  • 举报
回复
#include <iostream>

using namespace std;

class A
{
int i;
int& ir;
public:
A():i(100),ir(i)
{

}
};

void main()
{
cout<<sizeof(A)<<endl;
system("pause");
}
我认为C++中的引用是占内存的,(因为以上代码运行结果为8)
wjlsmail 2007-12-05
  • 打赏
  • 举报
回复
引用变量是不占用内存空间的,它只是与引用目标同一个内存空间的别名。
antimatterworld 2007-12-04
  • 打赏
  • 举报
回复
谁能整理一下,给出一个终极版的,谢谢!
wpalhm 2007-12-04
  • 打赏
  • 举报
回复
谢谢大家.这下我心中的疑问解开了!
vecri 2007-12-04
  • 打赏
  • 举报
回复
代码:
int a = 0xfebc;
int& b = a;

反汇编:
34: int a = 0xfebc;
00401458 C7 45 FC BC FE 00 00 mov dword ptr [ebp-4],0FEBCh
35: int& b = a;
0040145F 8D 45 FC lea eax,[ebp-4]
00401462 89 45 F8 mov dword ptr [ebp-8],eax
ebp-4为a的空间.
ebp-8为b的空间,存的是a的地址
夜神001 2007-12-03
  • 打赏
  • 举报
回复
43说得不错,引用就是有限制的指针。还有就是那个程序写得不好,返回内部类型数据时,不必使用引用了,性能提升有限或根本没有,反而可能会带来不必要的麻烦和错误。
luckcc 2007-12-03
  • 打赏
  • 举报
回复
引用不分配空间
武稀松 2007-12-03
  • 打赏
  • 举报
回复
引用在行为使用上是别名.
编译后是指针.
引用除了自己占的一个指针空间外,他指向的空间是原来对象的空间.
nj_dobetter 2007-12-03
  • 打赏
  • 举报
回复
讨论热烈啊。
什么都和底层的东西对应起来了,就这个“引用”搞得世界不安宁!
应该诅咒C++的设计者,TMD的给学习者带来这么大的麻烦。
webipstin 2007-12-03
  • 打赏
  • 举报
回复
引用就是指针

只不过引用是在C++语法上对指针的使用进了限制的别名
liufeng_cp 2007-12-03
  • 打赏
  • 举报
回复
反汇编一下就真相明了了,应该是与编译器相关的
long000 2007-12-02
  • 打赏
  • 举报
回复

同意35楼的意见,引用只是分配一个指针,我用的是VC6.0,
无论数据占用多大空间,在定义引用的时候都只是分配4个字节的空间,
引用占用的空间具体就不清楚了,可能是1个字节,这点不太确定,应
该和内存管理机制有关。因为字符只占用1个字节,但我在调试时却发
现编译器为每个字符都分配了4个字节的空间。
下面是我做的一个测试:
#include <iostream>
using namespace std;
int main()
{
int a=1;
int &b=a;
int c=3;
int *d=(&a-1);
cout<<&a<<endl;
cout<<&b<<endl;
cout<<&c<<endl;
cout<<a<<endl;
// *d=(int)&c; //第二次测试时加入该句再运行
cout<<b<<endl;
cout<<c<<endl;
system("pause");
return 1;
}
第一次测试输出:
0x0012ff7c
0x0012ff7c
0x0012ff74
1
1
3
第二次测试输出:
0x0012ff7c
0x0012ff7c
0x0012ff74
1
3
3
这应该和35楼说的一样,引用只分配一个指针,而不是重新构建对象,
如果要说引用占用空间的话,就应该是指针占用空间,也就是“别名”
占用空间
eatta 2007-12-02
  • 打赏
  • 举报
回复
楼上说的有道理.
39457760 2007-12-02
  • 打赏
  • 举报
回复
虽然结贴了,不过还是要说一下
引用变量还是占用内存的.
1.引用变量做形参时,需要通过堆栈传递参数,自然占用内存
2.引用变量做类的成员时,也要占用内存
3.在函数作用域内,如果定义为局部自动变量,还是要占用内存

下面是个类的例子

#pragma pack( 1 )
class No_Ref
{
public:
int a;
No_Ref():a(0){}
};
class Ref
{
public:
int a;
int & c;
Ref():a(0),c(a){}
};
#pragma pack

int main()
{
cout<<"类No_Ref大小:"<<sizeof(No_Ref)<<endl;
cout<<"类Ref大小:"<<sizeof(Ref)<<endl;
cout<<"引用变量占用的内存:"<<sizeof(Ref)-sizeof(No_Ref)<<endl;
}


下面的例子是局部变量的例子
int main()
{
int i;
int j;
int k;
int &ref = i;
int t;
cout<<&i<<" "<<&j<<" "<<&k<<" "<<&t<<endl;
//若ref不占用内存,则i,j,k,t,的地址差应该相同
cout<<"&i-&j="<<sizeof(int)*(&i-&j)
<<" &j-&k="<<sizeof(int)*(&j-&k)
<<" &k-&t="<<sizeof(int)*(&k-&t)<<endl;

cout<<"引用变量占用的内存:"<<sizeof(int)*(&k-&t)-sizeof(int)*(&j-&k)<<endl;
return 0;
}
FantasyNES 2007-12-02
  • 打赏
  • 举报
回复
绝大部分的编译器引用是用指针来实现的
CUSTCOM 2007-12-01
  • 打赏
  • 举报
回复
要是去学学C#和JAVA,再对比C++就好了,C#和JAVA里很难理解的就是引用类型和值类型的区别。而C#里的引用类型的变量实质其实和C++里的指针一样不过它却是指的是一个对象的名字,而并不是实际对象所在的空间,而C++里面的引用却是另一种机制,它是变量的一个别名。
wpalhm 2007-12-01
  • 打赏
  • 举报
回复
把引用理解为不去分配空间是好的。好用好理解。还不会出错!多好啊!
谢谢大家了!
long000 2007-12-01
  • 打赏
  • 举报
回复
楼主客气了~~~~
wpalhm 2007-12-01
  • 打赏
  • 举报
回复
long000谢谢你。也谢谢大家。我也不想去想这个问题了。只是一直以来都让我很迷惑。等会再给大家分吧。
谢谢大家的积极参与讨论!
long000 2007-12-01
  • 打赏
  • 举报
回复
如果引用也要分配空间的话那就应该重新创建一个对象,然后调用构造函数。这是对的。但是就未必要调用Test的构造函数!
如果调用Test的构造函数,岂不是去创建一个Test的对象了。那就失去引用的价值了。不是吗?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sorry,水平有限,只能回答到这个高度了,还是让其他高手来指点吧
加载更多回复(29)

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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