为什么引用作为类的成员会占用内存?

3 c++

有人告诉我,当引用是类的数据成员时,它们会占用内存,因为它们将被编译器转换为常量指针。这是为什么?就像为什么编译器(我知道它通常是特定于实现的)在它们是类的一部分时而不是在它们是临时变量时将引用作为指针?所以在这段代码中:

class A{
public:
  A(int &refval):m_ref(refval){};
private:
  int &m_ref;
}
Run Code Online (Sandbox Code Playgroud)

m_ref 将被视为常量指针(即它们确实占用内存)。

然而,在这段代码中:

void func(int &a){
  int &a_ref = a;
}
Run Code Online (Sandbox Code Playgroud)

编译器只是用实际变量替换引用(即它们不占用内存)。

因此,为了简单一点,我的问题基本上是:当常量指针是数据成员时,比它们是临时变量时,对它们进行引用更有意义吗?

ala*_*ain 5

C++ 标准仅定义引用的语义,而不定义它们的实际实现方式。所以这个问题的所有答案都是特定于编译器的。(愚蠢但合规的)编译器可能会选择将所有引用存储在硬盘上。只是事实证明,将引用存储为类成员的常量指针,并在可能的情况下用实际的引用替换引用的出现是最方便/最有效的。


作为编译器无法在编译时决定引用绑定到哪个对象的情况的示例,请考虑以下情况:

#include <iostream>

bool func() {
    int i;
    std::cin >> i;
    return i > 5;
}

int main() {
    int a = 3, b = 4;
    int& r = func() ? a : b;
    std::cout << r;
}
Run Code Online (Sandbox Code Playgroud)

所以一般来说程序必须在运行时存储一些关于引用的信息,有时,对于特殊情况,它可以在编译时证明引用绑定到什么。