Указатель "this" - это просто время компиляции? - PullRequest
0 голосов
/ 12 ноября 2018

Я спросил себя, можно ли использовать указатель this, так как я обычно использую его каждый раз, когда обращаюсь к переменной-члену или функции. Я задавался вопросом, может ли это повлиять на производительность, так как должен быть указатель, который нужно разыменовывать каждый раз. Поэтому я написал тестовый код

struct A {
    int x;

    A(int X) {
        x = X; /* And a second time with this->x = X; */
    }
};

int main() {
    A a(8);

    return 0;
}

и, что удивительно, даже при -O0 они выдают точно такой же код ассемблера.

Также, если я использую функцию-член и вызываю ее в другой функции-члене, это показывает то же поведение. Значит, указатель this - это просто время компиляции, а не фактический указатель? Или есть случаи, когда this фактически переводится и разыменовывается? Я использую GCC 4.4.3 между прочим.

Ответы [ 12 ]

0 голосов
/ 12 ноября 2018

Значит, этот указатель - просто вещь времени компиляции, а не фактический указатель?

Это очень это вещь времени выполнения. Он относится к объекту, для которого вызывается функция-член, естественно, этот объект может существовать во время выполнения.

Что такое Во время компиляции работает поиск имени. Когда компилятор встречает x = X, он должен выяснить, что это за назначаемое x. Так что он ищет его и находит переменную-член. Поскольку this->x и x относятся к одному и тому же, естественно, вы получаете одинаковый вывод сборки.

0 голосов
/ 12 ноября 2018

this всегда должен существовать, когда вы используете нестатический метод. Независимо от того, используете ли вы его явно или нет, у вас должна быть ссылка на текущий экземпляр, и это то, что this дает вам.

В обоих случаях вы обращаетесь к памяти через указатель this. Просто вы можете опустить его в некоторых случаях.

...