代码之家  ›  专栏  ›  技术社区  ›  user8221510

当类的成员时,为什么引用会占用内存?

c++
  •  2
  • user8221510  · 技术社区  · 7 年前

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

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

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

    然而,在本规范中:

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

    简单来说,我的问题是:当引用是数据成员时,与它们是临时变量时相比,什么使它们成为常量指针更有意义?

    3 回复  |  直到 7 年前
        1
  •  4
  •   alain    7 年前

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

    程序必须在运行时存储有关引用的一些信息,有时还需要存储 ,它可以在编译时证明引用绑定到什么。

        2
  •  0
  •   Neil    7 年前

    引用(或指针)必须存储在内存中的某个地方,那么为什么不将其与类的其余部分一起存储呢?

    int &a a_ref 不会占用更多内存,只是一个别名,但有 使用的内存 a .

        3
  •  0
  •   Petar Velev    7 年前

    假设一个类只是一个用户定义的数据类型。你需要一些能够引导你找到你所引用的实际事物的东西。 在第二种情况下使用实际值更多地是关于编译器及其优化代码的工作。