Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Вопрос в том, какую компиляцию считать "дорогОй". При компиляции больших текстов на C++, активно использующих шаблонную магию (которую неявно используют многие шаблоны std), количество создаваемых этими шаблонами вспомогательных классов/шаблонов может достигать тысяч и десятков тысяч. При вложении этих конструкций друг в друга количество этих сугубо мусорных объектов растет в геометрической прогрессии.
В общем-то корень проблемы лежит именно там.
S>>Хотя С++ практически целенаправленно организован так, что в нём невозможно сделать эффективную компиляцию.
ЕМ>Да можно, почему нет. Но тогда нужно прекратить вынос конструкций, генерирующих исполняемый код, в заголовки, включаемые множеством разных файлов. А это повлечет ухудшение оптимизации кода. Какую-то оптимизацию нынче делают линкеры, их возможности далеки от компиляторских.
Дело не в ухудшении оптимизации. А в том, что по-другому — никак. Вот у нас компилятор видит вызов какой-нибудь функции call(f, "foo", 42). Чтобы понять, что такое call, ему может потребоваться сделать довольно много приседаний. Если у нас call объявлена на основе шаблонной магии, компилятор начинает раскручивать шаблоны. При этом sfinae означает, что часть работы, возможно, будет выполнена впустую — раскрытый шаблон не подойдёт, и надо будет проверять другие варианты. Вот это всё в принципе не получится перенести в линкер — линкер не умеет раскрывать шаблоны и выбирать наилучшую перегрузку из возможных.
Всякие межпроцедурные оптимизации (если компилятор отдаёт не реальный бинарь, а IR) — да, может, и даже делает (LTCG).
ЕМ>Ну да, без них же не будет работать магия. 
Ну, не столько магия, сколько "декларативные компайл-тайм вычисления".