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