В C++ этот указатель передается методу как скрытый аргумент, который фактически указывает на текущий объект, но где этот «указатель» хранится в памяти ... в стеке, куче, данные, где ?Где выделена память для этого 'указателя'
ответ
Стандарт не определяет, где this
указатель хранится.
Когда он передается функции-члену в вызове этой функции, некоторые компиляторы передают ее в регистр, а другие передают ее в стек. Он также может зависеть от параметров компилятора.
О том, что вы можете быть уверены в том, что this
является базовым типом rvalue, поэтому вы не можете воспользоваться его адресом.
Это было не всегда так.
В предварительном стандарте C++ вы можете назначить this
, например. чтобы указать отказ конструктора. Это было до того, как были введены исключения. Современный стандартный способ указания сбоя конструкции заключается в том, чтобы выбросить исключение, которое гарантирует упорядоченную очистку (если не нарушено кодом пользователя, например, печально известная ошибка MFC new
).
В C++ this
является «просто» указателем на текущий объект. Он позволяет вам обращаться к объектно-ориентированным данным.
Например, если код в классе имеет следующий фрагмент кода:
this->temperature = 40.0f;
он устанавливает температуру для любого объекта в настоящее время сработают (в предположении temperature
не на уровне класса статический, разделенного среди всех объектов класса).
Сам указатель this
не должен выделяться (с точки зрения динамической памяти), он полностью зависит от того, как все это обрабатывается под обложками, то, что стандарт фактически не налагает (стандарт обычно фокусируется больше по поведению, чем внутренним).
Есть любое количество мест может быть: в стеке, в определенном месте памяти, в регистре и т. Д. Все, что вам нужно беспокоиться, - это поведение, которое в основном связано с тем, как вы используете его для доступа к объекту.
Что this
указывает на является сам объект, и это, как правило, выделяется new
для динамического распределения, или в стеке.
Этот указатель выделяется в стеке ваших функций класса (или иногда регистра).
Это, однако, вряд ли вопрос, который вы на самом деле спрашиваете.
На самом деле это, как представляется, именно тот вопрос, который задают. Я боюсь, что ответ слишком расплывчатый для взлома. –
Этот указатель находится в самом объекте *. Вид. Это местоположение памяти объекта.
Если объект находится в стеке, этот указатель находится в стеке.
Если объект находится в куче, этот указатель находится в куче.
Нижняя линия, вам не о чем беспокоиться.
* [ДОПОЛНЕНО] Позвольте мне отступить/уточнить/исправить свой ответ. Физический этот указатель не находится в объекте.
Я бы сделал вывод, что этот указатель получен компилятором и является просто адресом объекта, который хранится в таблице символов. Семантически, он находится внутри объекта, но это не то, о чем спрашивал OP.
Вот расположение памяти из 3 переменных в стеке. Средний - это объект. Вы можете видеть, что это имеет место, это одна переменная, и ничего больше:
, тогда, если мы вычислим размер объекта, тогда мы должны получить фактический размер + размер этого указателя, то есть 4 байта в дополнение .. но это не так. – nilesh
Я не думаю, что он отображается в операторе sizeof. Указатель может быть разных размеров в зависимости от компилятора. Если у вас есть виртуальные функции, есть также скрытая таблица указателей на функции, которые не отображаются в операторе sizeof. –
, но мы можем видеть дополнительные 4 байта, выделенные для виртуального указателя, который указывает на vtable – nilesh
- 1. Где выделена динамическая память?
- 2. Где выделена память для переменной T-SQL?
- 3. Где выделена память при создании этого массива? (C)
- 4. Будет ли выделена память для указателя структуры typedef?
- 5. Когда память выделена для программы?
- 6. Где выделена эта память - куча или стек?
- 7. Когда память выделена для программ?
- 8. Где выделена память для неизменяемой строки в c?
- 9. Когда память выделена переменной
- 10. Где выделена память при создании объекта в стеке?
- 11. Когда память выделена статическим переменным в C++
- 12. iOS Память не может быть выделена
- 13. Что произойдет, когда память будет выделена с использованием нового для указателя некласса
- 14. Когда память выделена локальным переменным в C
- 15. Когда память выделена функции (определение или вызов)
- 16. как выделена память для переменных типа значения в классе
- 17. Свободная память выделена в 3D-матрицу
- 18. Удалить Память выделена в другой функции?
- 19. strcpy отлично работает, хотя память не выделена
- 20. , где память выделяется для инициализированного указателя char в c
- 21. Память выделена для основного класса, выполненного из сервлета?
- 22. Как fmt.Println() память не выделена программой go?
- 23. Как освободить память в C#, которая выделена в C++
- 24. Когда память будет выделена для «Неинициализированной статической переменной» при инициализации?
- 25. Почему память выделена для * p в нижнем коде
- 26. 1GB память выделена для «lib/ruby / 2.1.0/timeout.rb»
- 27. Когда память выделена для типов значений в C#?
- 28. Когда память выделена для статической переменной в java?
- 29. зарезервирует память для этого объекта?
- 30. Память realloc для указателя, который был освобожден?
Предполагая, что вы имеете в виду, как ваш код знает, где 'this', когда метод вызывается ... Это будет отличаться в зависимости от ряда факторов, но, конечно, вы можете угадать или посмотреть на сборку своего компилятора генерирует, чтобы получить представление. – asveikau
Я читал, что «это» не является указателем на самом деле, его выражением, это правда? – nilesh
точный дубликат [Где находится этот «указатель», хранящийся в памяти компьютера?] (Http://stackoverflow.com/questions/16585562/where-is-the-this-pointer-stored-in-computer-memory) –