2014-01-12 4 views
5

В C++ этот указатель передается методу как скрытый аргумент, который фактически указывает на текущий объект, но где этот «указатель» хранится в памяти ... в стеке, куче, данные, где ?Где выделена память для этого 'указателя'

+0

Предполагая, что вы имеете в виду, как ваш код знает, где 'this', когда метод вызывается ... Это будет отличаться в зависимости от ряда факторов, но, конечно, вы можете угадать или посмотреть на сборку своего компилятора генерирует, чтобы получить представление. – asveikau

+0

Я читал, что «это» не является указателем на самом деле, его выражением, это правда? – nilesh

+0

точный дубликат [Где находится этот «указатель», хранящийся в памяти компьютера?] (Http://stackoverflow.com/questions/16585562/where-is-the-this-pointer-stored-in-computer-memory) –

ответ

6

Стандарт не определяет, где this указатель хранится.

Когда он передается функции-члену в вызове этой функции, некоторые компиляторы передают ее в регистр, а другие передают ее в стек. Он также может зависеть от параметров компилятора.

О том, что вы можете быть уверены в том, что this является базовым типом rvalue, поэтому вы не можете воспользоваться его адресом.

Это было не всегда так.

В предварительном стандарте C++ вы можете назначить this, например. чтобы указать отказ конструктора. Это было до того, как были введены исключения. Современный стандартный способ указания сбоя конструкции заключается в том, чтобы выбросить исключение, которое гарантирует упорядоченную очистку (если не нарушено кодом пользователя, например, печально известная ошибка MFC new).

1

В C++ this является «просто» указателем на текущий объект. Он позволяет вам обращаться к объектно-ориентированным данным.

Например, если код в классе имеет следующий фрагмент кода:

this->temperature = 40.0f; 

он устанавливает температуру для любого объекта в настоящее время сработают (в предположении temperature не на уровне класса статический, разделенного среди всех объектов класса).

Сам указатель this не должен выделяться (с точки зрения динамической памяти), он полностью зависит от того, как все это обрабатывается под обложками, то, что стандарт фактически не налагает (стандарт обычно фокусируется больше по поведению, чем внутренним).

Есть любое количество мест может быть: в стеке, в определенном месте памяти, в регистре и т. Д. Все, что вам нужно беспокоиться, - это поведение, которое в основном связано с тем, как вы используете его для доступа к объекту.

Что thisуказывает на является сам объект, и это, как правило, выделяется new для динамического распределения, или в стеке.

1

Этот указатель выделяется в стеке ваших функций класса (или иногда регистра).

Это, однако, вряд ли вопрос, который вы на самом деле спрашиваете.

+1

На самом деле это, как представляется, именно тот вопрос, который задают. Я боюсь, что ответ слишком расплывчатый для взлома. –

0

Этот указатель находится в самом объекте *. Вид. Это местоположение памяти объекта.

Если объект находится в стеке, этот указатель находится в стеке.

Если объект находится в куче, этот указатель находится в куче.

Нижняя линия, вам не о чем беспокоиться.

* [ДОПОЛНЕНО] Позвольте мне отступить/уточнить/исправить свой ответ. Физический этот указатель не находится в объекте.

Я бы сделал вывод, что этот указатель получен компилятором и является просто адресом объекта, который хранится в таблице символов. Семантически, он находится внутри объекта, но это не то, о чем спрашивал OP.

Вот расположение памяти из 3 переменных в стеке. Средний - это объект. Вы можете видеть, что это имеет место, это одна переменная, и ничего больше:

enter image description here

+0

, тогда, если мы вычислим размер объекта, тогда мы должны получить фактический размер + размер этого указателя, то есть 4 байта в дополнение .. но это не так. – nilesh

+0

Я не думаю, что он отображается в операторе sizeof. Указатель может быть разных размеров в зависимости от компилятора. Если у вас есть виртуальные функции, есть также скрытая таблица указателей на функции, которые не отображаются в операторе sizeof. –

+0

, но мы можем видеть дополнительные 4 байта, выделенные для виртуального указателя, который указывает на vtable – nilesh

Смежные вопросы