Как дополнительный синтаксис / спецификатор функций-членов влияет на расположение памяти в классах?
Я думаю, что у меня есть четкое понимание членов данных класса и их представления в памяти:
Члены класса определяют расположение объектов: члены данных хранятся один за другим в памяти. Когда используется наследование, члены данных производного класса просто добавляются к членам базы.
Однако, когда я пытаюсь выяснить, как "план" объекта изменяется его членами-функциями с дополнительными элементами синтаксиса: у меня возникают трудности. В следующем тексте я попытался перечислить весь проблемный синтаксисодного члена-функции, который затрудняет мне определение размера и структуры памяти объекта.
Функции члена класса, которые я не мог понять:
- тип функции:
lambda
, указатель на функцию, модифицирующую, не модифицирующую. - содержит дополнительные элементы синтаксиса:
friend
(с не-членом),virtual
,final
,override
,static
,const
,volatile
,mutable
,
Вопрос:
Каковы различия между функциями-членами с различными спецификаторами в контексте структуры памяти объекта и как они влияют на это?
Замечания:
Я уже читал это и это, что не дает удовлетворительного ответа2. Это говорит об общем случае (который я понимаю), который является наиболее близким к дубликату (НО я особенно о списке проблемных синтаксисов, который является моим актуальным вопросом и не рассматривается там).
1. С точки зрения влияния на расположение объектов памяти.
2. Первый говорит о компиляторе GCC, а второй содержит ссылку на книгу на @m@zon.
1 ответ
Функции-члены не являются частью структуры памяти объекта. Единственное, что можно приписать функциям-членам, - это скрытая ссылка на определяемую реализацией структуру, используемую для выполнения динамической диспетчеризации, такую как таблица виртуальных методов. Эта ссылка добавляется к вашему объекту, только если у него есть хотя бы одна виртуальная функция-член, поэтому объекты классов, у которых нет виртуальных функций, свободны от этих издержек.
Возвращаясь к вашему конкретному вопросу, единственный модификатор функции-члена, который оказывает какое-либо влияние на структуру памяти объекта, это virtual
* Другие модификаторы влияют на то, как интерпретируется сама функция, но они не изменяют структуру памяти вашего объекта.
* override
Ключевое слово также указывает на наличие виртуальной функции-члена в базовом классе, но это необязательно; добавление или удаление не меняет структуру памяти объекта.