Чтобы не делать их в рантайме.
Почему? Причина?
Потому что незачем делать много раз то, что можно сделать 1 раз.
Понял, получается что можем отдать компилятору на вычисление, то в runtime уже становится жестко закодировано и не вычисляется ?
Конечно. Плюс появляются дополнительные возможности для оптимизации компилятором с учётом того, что результат вычисления известен.
Я бы сказал, что причинно-следственная связь обратная - если что-то нужное в runtime может быть заранее посчитано и быть задано константой времени компиляции, то стоит это именно в таком ключе и использовать. По сути это "бесплатная" оптимизация
Значит "заранее посчитано" является основным признаком для выноса кода в compile-time. А какие элементы обычно туда уплывают? Константы наверное? Еще что?
Всё, что возможно вынести, лучше вынести. Там, где результат вычислений попадает в if, ещё и поменять его на if constexpr.
if( 1 + 2 == 3 )? Типа такого?
А если там запрос в СУБД или сетевой запрос?
Тогда при компиляции не вычислишь.
Что как бы и логично, странно такие вопросы задавать.
Скорее когда не напрямую константы написаны, а какие-то вычисления чуть более сложные, которые по факту приходят к сравнениям констант.
В первую очередь для мета-программирования. Преобразования над типами почти всегда требуют каких-либо вычислений. И вот эти вычисления происходят во время компиляции, так как к моменту наступления рантайма типы должны быть известны. А всякие constexpr factorial - это сказки, в реальном коде практически не встречающиеся.
Спасибо за информацию
Я пока чуть коснулся шаблонов, не до конца ясно всё.
Поэтому и эта тема пока трудновата, я в примерах часто встречаю квалификатор constexpr, а объяснения не нашёл.
Обсуждают сегодня