Вопрос

Я думал, что услышал, что D классы имеют два слова (2 пустота *) наверху вместо одного слова, требуемого C ++.Я также слышал, что макет VTable несовместимы с C ++.Я правильно помню?Если так, каковы обоснованные для этих решений?

Это было полезно?

Решение

Несколько вещей:

  1. в C ++, класс, который не имеет виртуальных функций, не будет Zero Zero наверху.
  2. в d класс всегда наследует виртуальные функции из Object, поэтому у него всегда есть этот генеракодицетагкод над головой, но также имеет __vptr, которые не имеют объектов класса C ++.
  3. как в C ++, так и D, будет дополнительный генеракодицетагCode для каждого интерфейса, что класс реализует.
  4. Схема VTable несовместима с C ++, поскольку D включает указатель на экземпляр __monitor, который имеет информацию о времени выполнения о классе.C ++, очевидно, не имеет этого, поэтому оно несовместимо.

Другие советы

Дополнительный указатель - это объект монитора для синхронизированных классов (там, по-видимому, разговоры о снятии его для несинхронизированных классов, но это не произошло).Макет документирован в Раздел ABI спецификации.

Я не уверен, как макет VTable отличается от того, как компиляторы C ++ делают это.Кто-то еще может ответить на это.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top