我被告知引用,当它们是类的数据成员时,它们占用内存,因为它们将被编译器转换为常量指针。这是为什么?就像为什么编译器(我知道它一般是特定于实现的)在它们是类的一部分时使引用成为指针,而不是它们是临时变量时? 所以在这段代码中:
class A{
public:
A(int &refval):m_ref(refval){};
private:
int &m_ref;
}
m_ref将被视为常量指针(即它们占用内存)。
但是,在此代码中:
void func(int &a){
int &a_ref = a;
}
编译器只是用实际变量替换引用(即它们不占用内存)。
因此,为了简化一点,我的问题基本上是:当它们是数据成员而不是临时变量时,使引用成为常量指针更有意义吗?
答案 0 :(得分:4)
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;
}
所以一般一个程序必须在运行时存储一些关于引用的信息,有时候,对于特殊情况,它可以在编译时证明引用绑定了什么到。
答案 1 :(得分:0)
引用(或指针)必须存储在某个地方的内存中,为什么不将它与其他类一起存储?
即使你的例子,参数a(int &a
)存储在内存中(可能在堆栈上),然后a_ref
不再使用更多的内存,它只是一个别名,但那里是a
使用的内存。
答案 2 :(得分:0)
想象一下,类只是用户定义的数据类型。你需要有一些东西可以引导你到你引用的实际东西。 在第二种情况下使用实际值更多地是关于编译器及其优化代码的工作。 引用应该是某个变量的别名,为什么当别名可以被优化为直接从堆栈中获取时,为什么该别名会使用内存。