Re[34]: И кстати про макросы Dart
От: Sinclair Россия https://github.com/evilguest/
Дата: 26.09.25 10:34
Оценка: 1 (1)
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Вопрос в том, какую компиляцию считать "дорогОй". При компиляции больших текстов на C++, активно использующих шаблонную магию (которую неявно используют многие шаблоны std), количество создаваемых этими шаблонами вспомогательных классов/шаблонов может достигать тысяч и десятков тысяч. При вложении этих конструкций друг в друга количество этих сугубо мусорных объектов растет в геометрической прогрессии.

В общем-то корень проблемы лежит именно там.
S>>Хотя С++ практически целенаправленно организован так, что в нём невозможно сделать эффективную компиляцию.

ЕМ>Да можно, почему нет. Но тогда нужно прекратить вынос конструкций, генерирующих исполняемый код, в заголовки, включаемые множеством разных файлов. А это повлечет ухудшение оптимизации кода. Какую-то оптимизацию нынче делают линкеры, их возможности далеки от компиляторских.

Дело не в ухудшении оптимизации. А в том, что по-другому — никак. Вот у нас компилятор видит вызов какой-нибудь функции call(f, "foo", 42). Чтобы понять, что такое call, ему может потребоваться сделать довольно много приседаний. Если у нас call объявлена на основе шаблонной магии, компилятор начинает раскручивать шаблоны. При этом sfinae означает, что часть работы, возможно, будет выполнена впустую — раскрытый шаблон не подойдёт, и надо будет проверять другие варианты. Вот это всё в принципе не получится перенести в линкер — линкер не умеет раскрывать шаблоны и выбирать наилучшую перегрузку из возможных.
Всякие межпроцедурные оптимизации (если компилятор отдаёт не реальный бинарь, а IR) — да, может, и даже делает (LTCG).
ЕМ>Ну да, без них же не будет работать магия.
Ну, не столько магия, сколько "декларативные компайл-тайм вычисления".
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.