C++中的引用是如何编码的?

14
int x = 10;
int& y = x;

对于此,x在栈上分配2/4/8字节,并将00...1010写入这些字节。对于y,内存布局和其内容会是什么样子?


4
不要假设它是4个字节,可能是8个字节。 引用在理论上只是程序员的方便。 在这种情况下,xy是同一件事,只是不同的名称。 实际上谁知道呢,如果编译器认为这有帮助,可能会有多个副本的 10。 记住,变量从不占用内存空间,只有它们所代表的值才占用。 - tadman
7
据我所知,C++标准只规定引用应该是另一个对象的别名,并不要求以任何特定方式实现,因此您不应该依赖这一点。请注意保持原意并使语言更加通俗易懂。 - Borgleader
3
@Borgleader 这是正确的,尽管它们的行为很像常量自动解引用指针。 - KABoissonneault
4
@KABoissonneault 嘘。。。。。。。。。。。。。。。。。。。:P - Borgleader
2
可能会出现y根本没有被分配,或者被分配为指针的情况。 - David Haim
显示剩余3条评论
3个回答

28

来自C++11标准8.3.2.4 [dcl.ref]

不确定引用是否需要存储空间。

因此,它可能需要存储空间,也可能不需要。


14

让我引用http://en.cppreference.com/w/cpp/language/reference:

引用不是对象; 它们不一定占用存储空间,尽管如果需要实现所需的语义(例如:引用类型的非静态数据成员通常通过分配内存地址所需的数量来增加类的大小),编译器可能会分配存储空间。


你太厉害了,抢在我之前完成了 :) - ydobonebi

5

从C++语言的角度来看,它并没有定义引用。

在实践中,编译器通常将引用与指针完全相同对待,即使它们在C++中具有许多不同的属性。这意味着被引用变量的地址是物理存储的。也许编译器唯一能做出的假设是引用不为空。尽管如此,我认为在C++代码中不能直接访问引用变量存储的地址,除非首先使用指针。

请注意,编译器通常可以优化引用变量,以至于您甚至无法确定它在汇编中的位置。它也可以对指针变量执行相同的操作。


1
不要忘记引用可以延长生命周期;在这些情况下,存储将是整个对象:{ Object& my_object = Object(); // my_object 的生命周期为整个块 } - Lucretiel
你确定引用可以超出单个表达式的生命周期吗?在我看来,这似乎会导致悬空引用。 - Ryan Pavlik
@Lucretiel 不要这样做 - NathanOliver
@Lucretiel const引用有时可以延长临时对象的生命周期。然而,认为引用本身占用了这个内存块是很奇怪的:它仍然是尚未被删除的对象的内存。 - stgatilov
抱歉,我的意思是一些引用- rvalue和const lvalue引用。在示例中所做的与将临时对象作为const ref或rvalue ref传递给函数参数完全相同。{ const Object& val = Object(); ... }就像void func(const Object&); ... func(Object());@NathanOliver 是的,我明白为什么这很奇怪,但它与rvalue引用没有任何区别-非const对象的生命周期被延长到引用的生命周期。 - Lucretiel
@Adrian删除了那个有问题的评论。我写那个评论时不确定自己在想什么。 - NathanOliver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接