Накладные расходы D классов
Вопрос
Я думал, что услышал, что D классы имеют два слова (2 пустота *) наверху вместо одного слова, требуемого C ++.Я также слышал, что макет VTable несовместимы с C ++.Я правильно помню?Если так, каковы обоснованные для этих решений?
Решение
Несколько вещей:
- в C ++, класс, который не имеет виртуальных функций, не будет Zero Zero наверху.
- в d класс всегда наследует виртуальные функции из
Object
, поэтому у него всегда есть этот генеракодицетагкод над головой, но также имеет__vptr
, которые не имеют объектов класса C ++. - как в C ++, так и D, будет дополнительный генеракодицетагCode для каждого интерфейса, что класс реализует.
Схема VTable несовместима с C ++, поскольку D включает указатель на экземпляр __monitor
, который имеет информацию о времени выполнения о классе.C ++, очевидно, не имеет этого, поэтому оно несовместимо.
Другие советы
Дополнительный указатель - это объект монитора для синхронизированных классов (там, по-видимому, разговоры о снятии его для несинхронизированных классов, но это не произошло).Макет документирован в Раздел ABI спецификации.
Я не уверен, как макет VTable отличается от того, как компиляторы C ++ делают это.Кто-то еще может ответить на это.