Значение указателей и ссылок в стеке C++

Возьмем к примеру код:

int x = 5;
int* ref = &x;
int& ref2 = x;

Стек программы:

Адресс Значение Переменная
0000002900F5FC44 5 x
0000002900F5FC68 0000002900F5FC44 *ref
? ? &ref2

Мой вопрос в том, что именно хранится на местах '?'.

Или другой пример:

int smth() {
    int x = 5;
    return x;
}

int& smth2() {
    int x = 5;
    return x;
}

Функция smth после своего выполнения положит на верхушку стека значение 5. Что будет на верхушке стека после вызова функции smth2?


Ответы (1 шт):

Автор решения: KoVadim

первый случай - а кто его знает. компилятор может представить ссылку как указатель и сохранить в стеке, тогда там будет скорее всего 0000002900F5FC44. А может оптимизировать и выбросить переменную. На усмотрение компилятора.

Функция smth после своего выполнения положит на верхушку стека значение 5.

неверно. Не после, а во время своего выполнения. А после своего выполнения там может быть все что угодно. Абсолютно.

Что будет на верхушке стека после вызова функции smth2?

А вот тут вообще нет смысла об этом рассуждать. Вы возвращаете ссылку на локальную переменную. А это UB. После выполнения такого кода компилятор имеет право делать все, что ему покажется правильным, например, записать туда 10. Имеет право.

→ Ссылка