c ++ 11 быстрые целые числа constexpr

Бить мертвую лошадь здесь. Типичный (и быстрый) способ делать целочисленные полномочия в C это классика:

int64_t ipow(int64_t base, int exp){
  int64_t result = 1;
  while(exp){
    if(exp & 1)
      result *= base;
    exp >>= 1;
    base *= base;
  }
  return result;
}

Однако мне понадобилась целочисленная мощность времени компиляции, поэтому я решил сделать рекурсивную реализацию с помощью constexpr:

constexpr int64_t ipow_(int base, int exp){
  return exp > 1 ? ipow_(base, (exp>>1) + (exp&1)) * ipow_(base, exp>>1) : base;
}
constexpr int64_t ipow(int base, int exp){
  return exp < 1 ? 1 : ipow_(base, exp);
}

Вторая функция предназначена только для обработки показателей меньше 1 предсказуемым образом. Переходяexp<0 ошибка в этом случае

Рекурсивная версия в 4 раза медленнее

Я генерирую вектор из 10E6 случайных значений базисов и показателей в диапазоне [0,15] и синхронизирую оба алгоритма с вектором (после несвоевременного запуска, чтобы попытаться удалить любые эффекты кэширования). Без оптимизации рекурсивный метод работает в два раза быстрее, чем цикл. Но с -O3 (GCC) цикл в 4 раза быстрее, чем рекурсивный метод.

Мой вопрос к вам, ребята, таков: Может ли кто-нибудь придумать более быструю функцию ipow (), которая обрабатывает экспоненту и базисы 0 и может использоваться какconstexpr?

(Отказ от ответственности: я ненужно быстрее ipow, мне просто интересно посмотреть, что умные люди здесь могут придумать).

Ответы на вопрос(2)

Ваш ответ на вопрос