Как дополнительный синтаксис / спецификатор функций-членов влияет на расположение памяти в классах?

Я думаю, что у меня есть четкое понимание членов данных класса и их представления в памяти:

Члены класса определяют расположение объектов: члены данных хранятся один за другим в памяти. Когда используется наследование, члены данных производного класса просто добавляются к членам базы.

Однако, когда я пытаюсь выяснить, как "план" объекта изменяется его членами-функциями с дополнительными элементами синтаксиса: у меня возникают трудности. В следующем тексте я попытался перечислить весь проблемный синтаксисодного члена-функции, который затрудняет мне определение размера и структуры памяти объекта.

Функции члена класса, которые я не мог понять:

  • тип функции: lambda, указатель на функцию, модифицирующую, не модифицирующую.
  • содержит дополнительные элементы синтаксиса: friend(с не-членом), virtual, final, override, static, const, volatile, mutable,

Вопрос:

Каковы различия между функциями-членами с различными спецификаторами в контексте структуры памяти объекта и как они влияют на это?


Замечания:

Я уже читал это и это, что не дает удовлетворительного ответа2. Это говорит об общем случае (который я понимаю), который является наиболее близким к дубликату (НО я особенно о списке проблемных синтаксисов, который является моим актуальным вопросом и не рассматривается там).

1. С точки зрения влияния на расположение объектов памяти.

2. Первый говорит о компиляторе GCC, а второй содержит ссылку на книгу на @m@zon.

1 ответ

Решение

Функции-члены не являются частью структуры памяти объекта. Единственное, что можно приписать функциям-членам, - это скрытая ссылка на определяемую реализацией структуру, используемую для выполнения динамической диспетчеризации, такую ​​как таблица виртуальных методов. Эта ссылка добавляется к вашему объекту, только если у него есть хотя бы одна виртуальная функция-член, поэтому объекты классов, у которых нет виртуальных функций, свободны от этих издержек.

Возвращаясь к вашему конкретному вопросу, единственный модификатор функции-члена, который оказывает какое-либо влияние на структуру памяти объекта, это virtual* Другие модификаторы влияют на то, как интерпретируется сама функция, но они не изменяют структуру памяти вашего объекта.

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

Другие вопросы по тегам