Когда я задал вопрос, в котором говорится, что является самым быстрым способом определения степеней 2, я получил ответ «предварительно рассчитать их и использовать справочную таблицу».
Как я могу предварительно рассчитать таблицу степеней 2, используя шаблоны?
Ссылка на мой предыдущий вопрос: Лучший способ найти силы 2
Вот идея:
constexpr std::array<unsigned long long, 16> LUT = {
1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768 };
template <int N>
struct pow2
{
enum { value = 2 * pow2<N - 1>::value };
};
template <>
struct pow2<0>
{
enum { value = 1 };
};
void foo()
{
const int x = pow2<4>::value; // == 16
const int y = pow2<0>::value; // == 1
int arr[x] = {0}; // Because x is constant
}
Живой код здесь
Тем не менее я бы предпочел 1U << n
над pow2<n>::value
если нет убедительных доказательств снижения производительности.