Как обработчик обрабатывает неинициализированные переменные? - PullRequest
0 голосов
/ 25 марта 2020

Итак, у меня есть задание, в котором мне нужно в сборке выяснить, как хранятся переменные, и у меня возникла проблема с выяснением того, как C ++ обрабатывает различные переменные.

MyClass var;
MyClass *p = new MyClass();
var.setX(3)

Что я думаю, я понял is: * p ссылка хранится в стеке, в то время как созданный объект размещается в куче. Что означало бы, что p ссылается на созданный объект. Пожалуйста, подтвердите, если правильно.

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

1 Ответ

5 голосов
/ 26 марта 2020

Утверждение, что p хранится в стеке, вводит в заблуждение. p имеет автоматическое c время хранения и будет храниться там, где компилятор решит сохранить его, если компилятор решит хранить его где-либо вообще. Он может храниться в стеке или, может быть, он целиком хранится в регистре и никогда не попадает в память вообще.

var точно такой же. Поскольку вы вызываете метод для него, вполне вероятно, что пространство для него зарезервировано в стеке, поскольку большинство соглашений о вызовах требуют, чтобы вызовы методов передавали адрес объекта. Но, возможно, нет. Если полное определение setX видно в точке вызова, возможно, компилятор встроит вызов. Все будет зависеть от точной специфики программы. Вот пример , где компилятор делает именно это. Обратите внимание, что ни одна часть var никогда не записывается в память; он полностью хранится в esi.

Аналогично, объект, выделенный new, имеет динамическую c продолжительность хранения. Это, вероятно, означает, что он будет жить в памяти, выделенной из кучи системы, но, опять же, это не определено языком C ++.

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