返回对成员变量数据的引用的开销

时间:2018-12-28 21:59:45

标签: c++ pointers reference

我是C ++的新手,当类方法返回对作为原始数据的成员变量的引用(而不是指针或引用)时,对于幕后的事情感到困惑。这是一个示例:

#include <iostream>

using namespace std;

struct Dog {
    int age;
};

class Wrapper {
public:
    Dog myDog;

    Dog& operator*() { return myDog; }
    Dog* operator->() { return &myDog; }
};

int main() {
    auto w = Wrapper();

    // Method 1
    w.myDog.age = 1;
    cout << w.myDog.age << "\n";

    // Method 2
    (*w).age = 2;
    cout << w.myDog.age << "\n";

    // Method 3
    w->age = 3;
    cout << w.myDog.age << "\n";
}

我的问题是:当代码读取(*w)w->(在main函数中)时,在运行时会发生什么?每次看到myDog(*it)时,它是否计算it->字段的地址?与直接访问myDog_相比,这两种访问方法中的任何一种都有开销吗?

谢谢!

1 个答案:

答案 0 :(得分:-1)

从技术上讲,您要问的完全是系统/编译器特定的。实际上,指针和引用在实现上是相同的。

没有理性的编译器可以处理

(*x).y

x->y 

不同。在幕后,两者通常都以汇编语言的形式出现,例如

y(Rn)

其中Rn是保存x的地址的寄存器,而y是y在结构中的偏移量。

问题在于C ++建立在C之上,而C又是有史以来设计的最多的f *&*)* p编程语言。参考构造是C传递参数的inept方法的变通方法。