常引用编译器会给分配空间吗?

hhhtwtt 2008-03-10 08:45:03
请教一个问题,
编译器在编译的时候,常引用会分配空间吗?
如const int& r=1;
...全文
825 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
hhhtwtt 2008-03-13
  • 打赏
  • 举报
回复
#include <iostream.h>
class MYC
{
const int a;
const int &b;
public:
MYC():a(10),b(a){};
};
class MYD
{
int a;
const int &b;
public:
MYD():a(10),b(a){};

};
void main()
{
MYC b;
int size,sizeb;
size=sizeof(MYC);
cout<<"size="<<size<<endl;
sizeb=sizeof(MYD);
cout<<"sizeb="<<sizeb<<endl;
}

这段代码的结果竟然这样的size=8
sizeb=8
hhhtwtt 2008-03-13
  • 打赏
  • 举报
回复
#include <iostream.h>
class MYC
{
const int a;
const int &b;
public:
MYC():a(10),b(a){};
};
class MYD
{
int a;
const int &b;
public:
MYD():a(10),b(a){};

};
void main()
{
MYC b;
int size,sizeb;
size=sizeof(MYC);
cout<<"size="<<size<<endl;
sizeb=sizeof(MYD);
cout<<"sizeb="<<sizeb<<endl;
}

这段代码的结果竟然这样的size=8
sizeb=8
taitanyt 2008-03-12
  • 打赏
  • 举报
回复
数字型不会,但字符型会分配在常量区中
liufangbj 2008-03-12
  • 打赏
  • 举报
回复
学习,飘过
w_anthony 2008-03-12
  • 打赏
  • 举报
回复
如果去掉优化编译,会分配一个指针的空间,但是由于优化编译的存在,它会根据实际情况决定要不要分配空间。
zh1369 2008-03-12
  • 打赏
  • 举报
回复
BIOHANZARDX 谦虚了。
开始没走脑子认为一定分配了空间。
系想想。编译器完全可以在引用处展开。也就不需要分配空间了。
lxjlan 2008-03-12
  • 打赏
  • 举报
回复
应该要指明这里的分配空间指的是哪里的空间。。。。应该来说,这样的话,应该在代码区存在的,看有没分配应该要考虑下分配空间的位置在哪。。。
BIOHANZARDX 2008-03-12
  • 打赏
  • 举报
回复
比较同意楼上的看法,确实完全取决于编译器的实现。前边的同仁例举反汇编代码,有一定的片面性,那些汇编代码都是不同的编译器下的汇编代码,对于编译器优化来说,从中能够看出来很多的优化动作,所以仅仅从理论上来说,不同的编译器有不同的设计实现,对于常引用来说。其实楼主何不发个邮件问问侯老爷子(你应该知道我是谁了:))。单从一个特定的编译器来讲,这个问题的答案就肯定了,有或者没有。


这个回答势必会招致同行们的笑话,在此请大家见谅了,个人简介而已。
lexchou 2008-03-12
  • 打赏
  • 举报
回复
编译器最多只会为常引用分配地址空间,绝对不会分配具体保存数据的空间。
cllr 2008-03-12
  • 打赏
  • 举报
回复
这个完全取决于编译器的实现:
我研究了一下gcc:
情况一:非静态局部变量,而且对该变量无取地址操作;如果进行优化编译,变量是不会被分配内存的,只会使用立即数;如果不使用优化编译,会在栈上给该变量分配地址;
情况二:非静态局部变量,对该变量有取地址操作;无论是否优化编译,都会在栈上分配内存;
情况三:静态或全局变量,无论是否取地址;无论是否优化编译,都会分配内存;

有趣的事情是,对于情况三中的全局变量,尽然有类似构造函数的东西出来:
080485ac <_GLOBAL__I_r>:
80485ac: 55 push %ebp
80485ad: 89 e5 mov %esp,%ebp
80485af: c7 05 e0 97 04 08 0c movl $0xc,0x80497e0
80485b6: 00 00 00
80485b9: c7 05 dc 97 04 08 e0 movl $0x80497e0,0x80497dc
80485c0: 97 04 08
80485c3: c9 leave
80485c4: c3 ret
80485c5: 90 nop
80485c6: 90 nop
80485c7: 90 nop
而对于情况三中的静态局部变量,仅仅是分配了一块地址:
8048599: c7 05 f8 97 04 08 0c movl $0xc,0x80497f8
80485a0: 00 00 00
80485a3: c7 05 fc 97 04 08 f8 movl $0x80497f8,0x80497fc
l51 2008-03-12
  • 打赏
  • 举报
回复
既然是"引用",那么肯定有一個源 和一個指針,那么它需要這兩個物件的內存空間,也就是說一定會分配內存。
但是這個"引用",一定是個指針,借 arong1234 的匯編說明一下:
int main()
{
0042D740 push ebp
0042D741 mov ebp,esp
0042D743 sub esp,0E4h
0042D749 push ebx
0042D74A push esi
0042D74B push edi
0042D74C lea edi,[ebp-0E4h]
0042D752 mov ecx,39h
0042D757 mov eax,0CCCCCCCCh
0042D75C rep stos dword ptr es:[edi]
const int& i = 100;
0042D75E mov dword ptr [ebp-14h],64h < <注意,这个ebp-14h不是引用的地址,变量本身是有地址的,这是变量自己的地址 <===這里用的是 ptr [ebp-14h]就是100這個常數的內存地址,但是要讓程序記住 i這個常量的指針是 ptr [ebp-14h]請看下面
0042D765 lea eax,[ebp-14h]
0042D768 mov dword ptr [i],eax <====這里才是將ptr [i]的內存裝入到 eax累加器,也就是i 已經是一個指針型內存物件了

int a = i + 100;
0042D76B mov eax,dword ptr [i]
0042D76E mov ecx,dword ptr [eax]
0042D770 add ecx,64h // 这个100在指令中 <===這是因為 i + 100 里面的 100是立即數,當立即數超出系統處理的位數時,也會變成間接尋址,也就是立即數也有可能變成內存物件。
0042D773 mov dword ptr [a],ecx
return 0;
0042D776 xor eax,eax
}

最后,建議大家還是讀一讀微機原理及匯編基礎吧,那對深入研究是有幫助的。
nicky_zs 2008-03-11
  • 打赏
  • 举报
回复
不用看汇编代码。你在程序中按顺序分配几个int变量,然后在中间插入一个const int &,然后你把所有的变量的地址打印出来。如果你发现这些地址不是等差数列,那么自然就说明编译器为const int &分配空间了啊。
记得把const int &绑定到变量、常数、常浮点数上面试试。记得看一下地址的差值。
ttlyfast 2008-03-11
  • 打赏
  • 举报
回复
哈哈
antimatterworld 2008-03-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 Chiyer 的回复:]
C/C++ code
由编译器决定,一般不会分配空间,而是直接生成在指令中

比如

int main()
{
0042D740 push ebp
0042D741 mov ebp,esp
0042D743 sub esp,0E4h
0042D749 push ebx
0042D74A push esi
0042D74B push edi
0042D74C lea edi,[ebp-0E4h]
0042D752 mov ecx,39h
0042D757 mov eax,0CCCCCCCCh
0042D75C rep st…
[/Quote]

得学习汇编了
Rainstorey 2008-03-11
  • 打赏
  • 举报
回复
占用内存但不分配内存
zhaodongyin 2008-03-11
  • 打赏
  • 举报
回复
会的
z_kris 2008-03-11
  • 打赏
  • 举报
回复
编译器一般还是通过指针来实现引用机制的
sheenl 2008-03-11
  • 打赏
  • 举报
回复
重要吗?
有很多常量, 都是不分配内存的。
比如说
const int i = 1;
这种语句, 很可能就不分配内存。(看你的程序怎么用这个常量了。)
taodm 2008-03-11
  • 打赏
  • 举报
回复
是“不要去关心分配不分配内存”,那是编译器的权利。
晨星 2008-03-11
  • 打赏
  • 举报
回复
用常量初始化常引用,实际是引用到临时变量,所以应该是占用空间的。

当然,从实际效果来看,在使用情形简单的上下文中(比如没有函数调用、参数传递,也没有取地址等动作),不排除个别编译器优化掉其所需空间的可能性。
举例来说:
{
const int& r = 5;
int j = r;
}
在这种情形下,最终的目标代码中是完全有可能优化掉那个临时变量的,便更复杂的情况又难说了。
但这种毕竟只是“优化”而已,而优化的程度随编译器不同而不同,而且常常可以用编译选项来人为控制。
所以讨论优化过于离题了。基本上,答案应该是:“占用空间”。
加载更多回复(15)

64,318

社区成员

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

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