当课程成员成员时,为什么参考会占据内存

Why do references occupy memory when member of a class?

本文关键字:成员 参考 为什么 内存 程成员      更新时间:2023-10-16

我被告知,当参考文献是类的数据成员时,它们会占据内存,因为它们会被编译器转换为恒定的指针。这是为什么?就像为什么编译器(我知道它是特定于实现的(当时是指指针,而不是临时变量时的指针?因此,在此代码中:

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

m_ref将被视为恒定指针(即它们确实占据内存(。

但是,在此代码中:

void func(int &a){
  int &a_ref = a;
}

编译器仅用实际变量替换参考(即它们不占据内存(。

因此,要简化一点,我的问题基本上是:在数据成员中,将引用变成恒定指示比临时变量时更有意义?

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;
}

so 一般一个程序必须在运行时存储一些有关参考的信息,有时,对于特殊情况,它可以在编译时证明参考到。

参考(或指针(必须存储在内存中,那么为什么不将其与其他类一起存储呢?

即使在您的示例中,参数A(int &a(也存储在内存中(可能在堆栈上(,那么a_ref不再使用任何内存,只是一个别名,但是那里 is a使用的内存。

想象类只是用户定义的数据类型。您需要拥有一些可以使您进入所引用的实际内容。在第二种情况下,使用实际值更多是关于编译器及其工作来优化您的代码。引用应该是对某些变量的别名,为什么当可以优化的记忆直接从堆栈中获取时,为什么要使用该别名。