сборка мусора — добавление уровня метакласса в объектную модель C ++

Может ли кто-нибудь объяснить этот теоретический вопрос об объектной модели C ++? Это было на моем недавнем экзамене, и я был озадачен этим.

Вопрос:
Отмечая успех Java, C # и Smalltalk, Комитет по стандартам C ++ решил добавить дополнительный уровень к объектной модели языка. А именно, каждый класс должен иметь метакласс, который имеет представление во время выполнения.

  1. Оппоненты говорят, что это противоречит одному из фундаментальных принципов языка. Который? Объясните.

  2. Оппоненты также утверждают, что C ++ имеет дополнительный «полууровень», который позволяет использовать некоторые функциональные возможности полноценного уровня метакласса. Что это за «полууровень» и какие класы пользуются его возможностями?

  3. Сторонники выступили с победным аргументом. Добавление уровня обеспечит поддержку фазы Mark в Mark & Уборка мусора (в которой все доступные объекты сначала помечаются, а затем недоступные освобождаются). На какую особенность дополнительного уровня опирается их аргумент?

  4. Кроме того, сторонники выступили с еще одним аргументом. Дополнительный уровень сделает виртуальные деструкторы избыточными, даже без системы сбора мусора. Объясните, когда и зачем нужен виртуальный деструктор и как дополнительный уровень устранит это требование?

2

Решение

Поскольку я не был на вашем курсе, я могу только догадываться:

1: C ++ — это своего рода набор lego — вы берете то, что вам нужно, и можете оставить все остальное. Вы не должны платить за это либо. Добавление этого дополнительного уровня требует некоторой инициализации и прочего, и я полагаю, что вы не можете не использовать его, даже если он вам не нужен.

2: RTTI для классов с vtable

3: Здесь я могу только догадываться — я предполагаю, что все экземпляры класса каким-то образом достижимы мета-классом или могут быть обнаружены путем сканирования памяти. Если это так, вы можете реализовать знак&подметать.

4: виртуальные деструкторы необходимы, если вы уничтожаете экземпляр класса с помощью указателя, который имеет тип одного из базовых классов. Если вы можете получить из каждого экземпляра метакласс, вы можете вызвать правильный деструктор без необходимости искать его в vtable.

3

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

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

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