Переменные constexpr, определенные в заголовке, оцениваются несколько раз во время компиляции

Рассмотрим следующий заголовочный файл, который состоит из медленной функции constexpr, которая используется для инициализации глобальной переменной:

constexpr int slow_func() {
for (int i = 0; i < 100*1024*100; ++i)
;
return 0;
}

constexpr int g_val = slow_func();

Вызов этой функции занимает ~ 10 с

Теперь, если этот заголовок # включается в несколько единиц перевода, время компиляции увеличивается на каждую единицу перевода, которая включает этот файл

С сотнями переводческих единиц сборка теперь занимает неоправданное количество времени.

Поскольку это функция constexpr, я предположил, что компилятор оценить возвращаемое значение этой функции только один раз, и использовать одно и то же значение в разных единицах перевода

Есть ли способ сказать компилятору оценивать значение каждого ‘g_val’ только один раз?
Если нет, что можно сделать?

В настоящее время я использую g ++ — 5.4, но я предполагаю, что стандарт требует такого поведения (хотя я не нашел его в текущем стандарте)

3

Решение

Из-за того, как работает #include, вам лучше сделать переменную где-то один раз, а затем сделать ее глобальной переменной, объявленной вперед (путем #include forw. Dec.) Во всех ваших единицах перевода. Это так, что он должен быть скомпилирован только один раз, но везде, где он объявлен, может использовать его.

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]