我是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_
相比,这两种访问方法中的任何一种都有开销吗?
谢谢!
答案 0 :(得分:-1)
从技术上讲,您要问的完全是系统/编译器特定的。实际上,指针和引用在实现上是相同的。
没有理性的编译器可以处理
(*x).y
和
x->y
不同。在幕后,两者通常都以汇编语言的形式出现,例如
y(Rn)
其中Rn是保存x的地址的寄存器,而y是y在结构中的偏移量。
问题在于C ++建立在C之上,而C又是有史以来设计的最多的f *&*)* p编程语言。参考构造是C传递参数的inept方法的变通方法。