Что происходит в памяти, когда создается экземпляр класса C ++ - PullRequest
6 голосов
/ 27 апреля 2010

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

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

Спасибо, Джо

Ответы [ 5 ]

8 голосов
/ 27 апреля 2010

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

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

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

1 голос
/ 27 апреля 2010

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

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

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

0 голосов
/ 23 февраля 2015

Как правило, когда создается экземпляр класса, выделяется новый блок памяти. Выделенная память содержит:

  1. Нестатические члены-данные класса и унаследованные нестатические данные-члены базового класса.
  2. Если класс имеет одну или несколько виртуальных функций, то экземпляр класса также содержит указатель на таблицу виртуальных функций этого класса.

Функции класса не копируются при создании нового экземпляра. Это поможет понять, из чего состоит размер объекта.

0 голосов
/ 27 апреля 2010

Обычный случай:

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

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

0 голосов
/ 27 апреля 2010

Когда создается объект;

  1. Память выделена
  2. Конструктор выполнен
  3. vtable "настроен"

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

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

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