Что происходит в памяти, когда класс C++ инстанцируют

Я интересуюсь гайками и boltw C++, и я задался вопросом, что на самом деле изменяется, когда объект инстанцируют. Мне особенно интересно, если функции затем добавляются к памяти, если они там от времени выполнения или если они никогда не хранятся в памяти вообще.

Если кто-либо мог бы направить меня к хорошему сайту на некоторых базовых болтах C и C++, я любил бы это также.

Спасибо, Jo

6
задан Jo Bucher 27 April 2010 в 00:24
поделиться

4 ответа

Типичный случай:

  1. Память выделяется путем вызова оператора new . Эта функция, скорее всего, уже будет в памяти, она нужна очень много.
  2. Вызывается конструктор класса. Этот код уже мог быть в памяти. Если нет, то при вызове этой функции происходит сбой страницы. ОС отмечает и загружает соответствующую страницу из исполняемого файла в ОЗУ. Затем он приказывает ОС повторить попытку. (2A.Ctor обеспечивает возможность вызова виртуальных функций - часто путем записи указателя vtable)
  3. Скорее всего, страница с конструктором также содержит другие члены вашего класса. Те тоже могут быть вызваны. Но если они находятся на другой странице, их вызов может вызвать еще одну ошибку страницы и другую загрузку. Если ваш компилятор поместил vtable на другую страницу, использование этой vtable также может вызвать сбой страницы.

Преимущество такого механизма загрузки по требованию состоит в том, что ОС может избежать загрузки кода для класса CPrinter , если пользователь никогда не намеревается распечатать свой документ.

0
ответ дан 10 December 2019 в 02:44
поделиться

Не уверен в хорошем веб-сайте, но Внутри объектной модели C ++ - довольно хорошая книга.

По крайней мере, в обычном случае функции-члены существуют полностью независимо от любого экземпляра класса. Вместо этого экземпляр класса - это структура, содержащая (нестатические) элементы данных объекта.Если в классе есть хотя бы одна виртуальная функция, объект также будет содержать указатель на vtable, которая в основном представляет собой массив указателей на функции.

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

8
ответ дан 10 December 2019 в 02:44
поделиться

Все функции хранятся в самом исполняемом файле, поэтому они загружаются с самого начала.

Выделяется вся память, необходимая этому объекту для переменных-членов.

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

1
ответ дан 10 December 2019 в 02:44
поделиться

Когда создается экземпляр объекта;

  1. Выделяется память
  2. Конструктор выполняется
  3. Таблица vtable «настроена»

Номер 3 - причина почему конструкторы не могут вызывать виртуальные функции в производных классах (когда конструктор выполняется, vtable еще не «настроен»).

Вы можете получить тот же эффект, используя идиому письмо / конверт. См. Расширенные стили и идиомы программирования C ++ , чтобы узнать об этом и многом другом.

0
ответ дан 10 December 2019 в 02:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: