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

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

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

Тем не менее, когда я пытаюсь выяснить, как «План» объекта модифицируется его членами функции с дополнительными элементами синтаксиса: у меня трудности. В следующем тексте я попытался перечислить все проблемные1 Синтаксис члена функции, который мешает мне определить размер и структуру памяти объекта.

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

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

Вопрос:

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


Замечания:

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

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

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

1

Решение

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

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

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]