Затраты на возврат ссылки на данные переменной члена - PullRequest
0 голосов
/ 29 декабря 2018

Я новичок в 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 голосов
/ 29 декабря 2018

Технически, то, что вы спрашиваете, полностью зависит от системы / компилятора.На практике указатель и ссылка идентичны в реализации.

Ни один рациональный компилятор не будет обрабатывать

(*x).y

и

x->y 

по-разному.Под крышками оба обычно отображаются на ассемблере как-то вроде

y(Rn)

Где Rn - регистр, содержащий адрес x, а y - смещение y в структуре.

Проблемав том, что C ++ построен на C, который, в свою очередь, является самым популярным языком программирования, когда-либо созданным.Эталонная конструкция - это обход неумелого метода передачи параметров в C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...