Re[2]: шаблонный виртуальный метод
От: B0FEE664  
Дата: 29.06.15 17:42
Оценка: -1
Здравствуйте, watchmaker, Вы писали:

BFE>>Нет ничего сложного в том, чтобы компилятор сгенерил CallFunImpl для каждого виртуального шаблонного метода, но писателем компиляторов что-то мешает. Кто-нибудь знает, что именно им мешает?

W>Так раздельная компиляция же. Пока вся программа умещается в одном файле, действительно, нет ничего сложного. Как только появляется пара объектных файлов, то внезапно не получается в реализации базового класса перечислить всех его наследников и все используемые в них шаблонные специализации, о которых базовый класс на момент компиляции ничего не знает. В варианте без шаблонов просто создаётся vtable со всеми возможными сигнатурами уже известных виртуальных функций, а наследники её используют. В случае же шаблонов что и сколько класть в такую vtable неизвестно пока не получен список всех наследников и всех используемых специализаций. И даже техники вроде whole program optimization такой список построить не помогут — ведь наследник может объявится где-нибудь в сторонней dll или so.

Всё это похоже на отговорки, потому, что:
1. приведённый код можно разбросать по многим файлам и он будет работать (и компилироваться, и линковаться). При этом внешняя шаблонная функция, заменяющая таблицу вызовов для виртуальных шаблонных методов, может быть создана кодогенератором (это сложно, но никакой интеллектуальной работы требующей участия человека не требуется)
2. реализация вызова виртуальных методов не обязана базироваться на единой таблице — стандарт этого не требует. Нет ничего страшного в том, чтобы под каждый шаблонный виртуальный метод добавить свою таблицу вызовов для всех специализаций этой функции. Да, все возможные сигнатуры не известны в одном модуле, но что мешает написать сбор всех сигнатур для специализаций этой функции из всех модулей? Сейчас шаблонные функции тоже разбросаны по разным модулям и что? Ведь все шаблонные функции с одинаковой сигнатурой заменяются единственной реализацией. Что сложного в том, чтобы взять адрес такой функции и записать его в таблицу? Не понимаю.

W>В варианте без шаблонов просто создаётся vtable со всеми возможными сигнатурами уже известных виртуальных функций, а наследники её используют. В случае же шаблонов что и сколько класть в такую vtable неизвестно пока не получен список всех наследников и всех используемых специализаций.

Наследник может добавить новый виртуальный метод в таблицу. Это не сильно отличается от того, что новая специализация может добавить ещё одну строчку в таблицу. Какая в этом сложность?

W>наследник может объявится где-нибудь в сторонней dll или so.

Можно не поддерживать dll и so для этих методов. Кстати, наследник поменяет не больше, чем обычная перегрузка виртуального метода. Поменять таблицу может только новая специализация — она добавляет ещё одну функцию в таблицу. Что в этом сложного?

W>Так экспорт шаблонов наоборот убрали из стандарта. А ждать шаблонные виртуальные методы раньше возврата экспорта ну явно не стоит.

Хмм. А причём тут экспорт шаблонов?
И каждый день — без права на ошибку...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.