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