Будет ли GNU GCC отслеживать объекты, которые ранее были разыменованы с помощью оператора со стрелкой? - PullRequest
0 голосов
/ 17 февраля 2019

Используя следующую структуру,

struct A
{
    A(int d1, int d2)
    {
        data1 = d1;
        data2 = d2;
    }

    int data1, data2;
};

будет ли последняя строка в функции ниже разыменовывать указатель снова, или компилятор узнает, что использовал ранее разыменованный объект?

int main()
{
    A* a = new A(1, 2);

    //dereference a
    cout << a->data1 << endl;

    //dereference a again?
    cout << a->data2 << endl;
}

Если нет, есть ли какие-нибудь компиляторы, которые могли бы сделать это?

Я знаю, что могу провести эксперимент, чтобы проверить свой вопрос, однако я не очень хорошо знаю язык ассемблера.

1 Ответ

0 голосов
/ 17 февраля 2019

Да, возможно, что в подобных случаях сгенерированный код не будет буквально выполнять другую разыменование.Это произойдет, когда компилятор может точно сказать, что a не изменится между двумя операторами.

Это обычная категория оптимизации, которая является причиной многих ошибок, когда люди нарушают строгие правила псевдонимов (поскольку это потенциально нарушает способность компилятора обнаруживать, что a не изменился).

...