Как кодирует доступ к переменным-членам в другом фрейме стека? - PullRequest
0 голосов
/ 17 марта 2019
class foo {
  public:
    foo() : foo_member1(1)
    int foo_member1;
    void do_something() {foo_member1++;}
}

int main(){
    foo my_foo;
    my_foo.do_something();
}

Где все хранится в приведенном выше примере кода?Это было то, о чем я думал, когда ехал домой, и смутился, что не смог ответить наверняка.Я создаю объект, содержащий переменную как в стеке.Когда я вызываю do_something и ввожу новый кадр стека, как у него есть доступ к переменной-члену, которая была сохранена в предыдущем кадре стека как часть объекта my_foo?Это скопировано в?Прошло тихо внизу по ссылке?Или это на самом деле оказывается в куче?Или существует какой-то особый механизм, с помощью которого код может получить доступ к чему-то, что предшествует ему в стеке?

1 Ответ

0 голосов
/ 17 марта 2019

Это:

   my_foo.do_something(); 

Вызывает метод foo::do_something(), передавая скрытый параметр this = &my_foo. Это обычная функция C, которая просто получает скрытый параметр. Код do_something на самом деле не обращается к фрейму стека main, он просто использует this, который main передан.

Внутри do_something код обрабатывается как:

this->foo_member1++;

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

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