老问题,引用占不占内存

dqezlms 2012-11-27 03:31:27
在《深度探索C++对象模型》中的30页里面有一句“b、pb、rb会有怎样的内存需求呢?不管指针或引用都只需要一个word的空间”(英文版在39页“What can we say about the memory requirements of b ,pb ,rb and ? Both the pointer and reference require a single word of storage (4 bytes on a 32-bit processor)”),看到这样一句就纠结了,以前一直认为引用只是个别名,不占内存的。在这里怎么又这种解释?

求各路精英大神指点
...全文
565 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
yisikaipu 2012-11-28
  • 打赏
  • 举报
回复
引用 15 楼 pengyw 的回复:
看出,优化下,引用占用的地址空间是被优化掉了的
这种例子里即使没有引用也照样优化 充其量只说明引用更容易被优化 如果具体的实现就是按幕后指针方式,那再优化也还得留一个指针,试试下例
class Lei
{
public:
	char name[256];
};

Lei e;

class Cls
{
public:
	Cls():m(e){}	
	Lei& m;
};

class Kong
{
};

int main()
{
	cout <<sizeof(Lei) <<endl;
	cout <<sizeof(Cls) <<endl;
	cout <<sizeof(Kong) <<endl;
	return 0;
}
yisikaipu 2012-11-28
  • 打赏
  • 举报
回复
引用 11 楼 SKATE11 的回复:
弱弱的问下函数参数中的引用会不会分配栈空间
就我对标准的有限了解,就连函数是否需要存储,标准也没有确定。标准明确说的是对象(object)须存储(storage)。如果采用通常的幕后指针(指针是对象)的方式实现引用,那么参数当然须分配空间。 而引用(reference)引用(refer to)对象或函数,但本身不是对象,也不是函数。即引用(reference)不能引用(refer to)引用(reference)。 2011标准有这样的描述: $8.3.2/1 ... [Note: A reference can be thought of as a name of an object. —end note] ... 这里说引用就是名字 $8.3.2/4 It is unspecified whether or not a reference requires storage. 这里说不指定引用是否须存储 $3.7/3 The storage duration categories apply to references as well. The lifetime of a reference is its storage duration. 这里的意思是说存储引用(reference)时,则其类别的处理与存储对象(object)的一样对待 $1.7/3 ... [Note: Various features of the language, such as references and virtual functions, might involve additional memory locations that are not accessible to programs but are managed by the implementation. —end note] ... 这里说引用在实现上可能涉及更多的内存位置(memory location),只是这些位置程序不可访问
pengyw 2012-11-28
  • 打赏
  • 举报
回复
刚少粘一行 004012F4 add dword ptr [g_a (40512Ch)],ebx
转角天边 2012-11-28
  • 打赏
  • 举报
回复
Both the pointer and reference require a single word of storage (4 bytes on a 32-bit processor) 这个word是用来存储变量名的
pengyw 2012-11-28
  • 打赏
  • 举报
回复
引用 10 楼 linghu9990 的回复:
引用 8 楼 pengyw 的回复: struct haveRefStruct { int j; int &amp;k; }; int nSize = sizeof(haveRefStruct); nSize = 8; 说明因引用也是占字节的, ---------------------------------------------------------------……
VS2005: 一:debug,无优化 // TODO: Add extra initialization here int &j = g_a; 004171D2 mov dword ptr [ebp-38h],offset g_a (4200E8h) j++; 004171D9 mov eax,dword ptr [ebp-38h] 004171DC mov ecx,dword ptr [eax] 004171DE add ecx,1 004171E1 mov edx,dword ptr [ebp-38h] 004171E4 mov dword ptr [edx],ecx Sleep(1);//仅仅是想分割一下两个++ 004171E6 mov esi,esp 004171E8 push 1 004171EA call dword ptr [__imp__Sleep@4 (421668h)] 004171F0 cmp esi,esp 004171F2 call @ILT+1430(__RTC_CheckEsp) (41159Bh) g_a++; 004171F7 mov eax,dword ptr [g_a (4200E8h)] 004171FC add eax,1 004171FF mov dword ptr [g_a (4200E8h)],eax 看出,非优化下,引用还是额外分配了地址空间的 二:优化下 // TODO: Add extra initialization here int &j = g_a; j++; 004012E7 add dword ptr [g_a (40512Ch)],ebx Sleep(1); 004012ED push ebx 004012EE call dword ptr [__imp__Sleep@4 (40303Ch)] g_a++; 看出,优化下,引用占用的地址空间是被优化掉了的 //自己也学习了,哈哈
wjb_yd 2012-11-28
  • 打赏
  • 举报
回复
引用 11 楼 SKATE11 的回复:
弱弱的问下函数参数中的引用会不会分配栈空间
会压入一个指针大小的值
pengyw 2012-11-28
  • 打赏
  • 举报
回复
引用 11 楼 SKATE11 的回复:
弱弱的问下函数参数中的引用会不会分配栈空间
充其量是一个机器字的空间
zzmc 2012-11-27
  • 打赏
  • 举报
回复
学习 拉。总结:引用 究其根本其实也是一种指针!但引用在初始化时直接指向初始化内容的指针。
SKATE11 2012-11-27
  • 打赏
  • 举报
回复
弱弱的问下函数参数中的引用会不会分配栈空间
towriting 2012-11-27
  • 打赏
  • 举报
回复
引用 8 楼 pengyw 的回复:
struct haveRefStruct { int j; int &k; }; int nSize = sizeof(haveRefStruct); nSize = 8; 说明因引用也是占字节的,
----------------------------------------------------------------------------------------------------------------- 因为类是可复用的模块,所以需要用地址保存不同类实例的引用成员变量。 但如果函数内呢:
void test()
{
  int i = 0;
  int &j = i; //这种函数内的引用完全可以由编译优化为直接是i的地址,这里起的是别名的作用
  j = 1;
}
yisikaipu 2012-11-27
  • 打赏
  • 举报
回复
引用 8 楼 pengyw 的回复:
struct haveRefStruct { int j; int &k; }; int nSize = sizeof(haveRefStruct); nSize = 8; 说明因引用也是占字节的,
其实还是说明指针占字节 不过我误解#1楼的意思了
pengyw 2012-11-27
  • 打赏
  • 举报
回复
struct haveRefStruct { int j; int &k; }; int nSize = sizeof(haveRefStruct); nSize = 8; 说明因引用也是占字节的,
唯恐天下不乱 2012-11-27
  • 打赏
  • 举报
回复
引用原理差不多就是指针,编译器会处理
yisikaipu 2012-11-27
  • 打赏
  • 举报
回复
sizeof 03标准 $5.3.3/2 When applied to a reference or a reference type, the result is the size of the referenced type.
yisikaipu 2012-11-27
  • 打赏
  • 举报
回复
引用 1 楼 akirya 的回复:
弄个结构体,放个引用类型的,然后sizeof(结构体)。
这怎么能判断出引用是否占内存? sizeof(结构体的引用) 是该结构体的size,不是该引用本身的size
c_rrb 2012-11-27
  • 打赏
  • 举报
回复
引用 3 楼 yisikaipu 的回复:
一,这本书探索的不是标准C++ 二,标准没有指定引用是否需要存储。但一般的实现都是用一个幕后的指针,这个指针显然需要存储。 03标准 $8.3.2/3 It is unspecified whether or not a reference requires storage.
+++
yisikaipu 2012-11-27
  • 打赏
  • 举报
回复
一,这本书探索的不是标准C++ 二,标准没有指定引用是否需要存储。但一般的实现都是用一个幕后的指针,这个指针显然需要存储。 03标准 $8.3.2/3 It is unspecified whether or not a reference requires storage.
ouyh12345 2012-11-27
  • 打赏
  • 举报
回复
引用和指针都是一个变量,需要有地方存放这个变量
  • 打赏
  • 举报
回复
弄个结构体,放个引用类型的,然后sizeof(结构体)。

65,210

社区成员

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

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