引用实际上可以占用内存吗?

5
阅读完这个答案后,我不确定引用是否真的占用内存。我知道当编译器将引用替换为被引用的变量时,它不会占用内存,就像交换引用和被引用变量一样。
然而,

通常情况下,编译器将引用实现为指针。但是,它们通常有关于引用可能指向什么的更多信息,并将其用于优化。

由于指针确实占用内存,那么编译器将其作为指针实现,该引用现在不会占用内存吗?在编译器选择将引用作为指针而不仅仅是交换它时,可以说引用实际上以一种微小的隐式方式占用内存吗?
实际上,编译器何时选择将引用实现为指针而不是交换,或者这与编译器不同?

1
这完全由实现定义。根据标准,引用不需要占用任何空间。 - NathanOliver
“这完全是实现定义。”很好,这回答了最后一个问题,谢谢。但是当编译器选择将引用作为指针时,是否可以说引用以一种轻微的隐式方式占用内存呢?@NathanOliver - user8221510
2
是的,如果引用确实是指针,那么它会占用空间。你只有在检查汇编代码时才能知道它是否是指针。 - NathanOliver
实际上,我并不认为我的主要问题已经得到回答 :-/ 只是它是否与实现相关... - user8221510
1
优化编译器可以在可行的情况下消除缓慢的内存引用。 - stark
显示剩余4条评论
1个回答

2

如果引用是类的成员,它肯定会占用一些空间。例如:

class A{
public:
  A(int &refval):m_ref(refval){};
private:
  int &m_ref;
}

编译器会将此变量视为常量指针。但是,如果您在作用域内使用它作为临时变量,则没有理由使用内存:
void func(int &a){
  int &a_ref = a;
}

编译器将会用实际变量替换引用。

哇,我以为处理引用时是否将其视为指针是实现特定的。我的意思是,你正在定义何时将引用视为指针,这与Nathan和Pete所说的相反。还是我理解错了什么? - user8221510
@geza 噢,好的,现在更有意义了。但是当指针占用内存而引用不占用内存时,将引用转换为指针怎么能被编译器视为优化呢? - user8221510
1
@Thu,这并不被视为一种优化。类成员引用被实现为指针。如果你仔细想想,你怎么能用其他方式来实现它呢?没有什么“神奇”的东西可以让引用不占用内存。即使在其他情况下,而不仅仅是作为类成员时也是如此。例如,当你有一个带有“const Object &”参数的函数时,它被实现为指针。 - geza
@geza,我明白你的意思,但是编译器没有理由将引用作为常量指针,当引用被初始化为另一个类成员时,例如 int abc; int& reffer = abc;,我是对的吗?如果是这样,那么“类成员引用被实现为指针”这个说法并不完全正确,对吗? - user8221510
谢谢。但是你说“类成员引用被实现为指针。如果你想一想,你怎么能用其他方式来实现它呢?”你当时到底是什么意思?请详细说明一下。到目前为止,你真的帮了我很多,我知道:))@geza - user8221510
显示剩余5条评论

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