社区讨论

关于 constexpr

学术版参与者 4已保存回复 9

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
9 条
当前快照
1 份
快照标识符
@lo7xw4pu
此快照首次捕获于
2023/10/27 09:33
2 年前
此快照最后确认于
2023/10/27 09:33
2 年前
查看原帖
考虑这段代码
CPP
#include <stdio.h>
#include <stdint.h>
#include <array>

using u64 = uint64_t;

constexpr u64 M = 14647171131086947261ull;

inline constexpr std::array<u64, 1 << 16> prep(u64 x)
{
    std::array<u64, 1 << 16> arr = {0};
    arr[0] = 1;
    for (u64 i = 1; i < (1 << 16); i++)
        arr[i] = x * arr[i - 1];
    return arr;
}

constexpr std::array<u64, 1 << 16>
    arr0 = prep(14647171131086947261ull), 
//     arr1 = prep(3368000560697704449ull), 
//     arr2 = prep(18402376254088019969ull), 
//     arr3 = prep(6896136929411072001ull);

/*
inline constexpr u64 qpow(u64 x)
{
    u64 x0 = x          & ((1 << 16) - 1);
    u64 x1 = (x >> 16)  & ((1 << 16) - 1);
    u64 x2 = (x >> 32)  & ((1 << 16) - 1);
    u64 x3 = (x >> 48)  & ((1 << 16) - 1);
    return arr0[x0] * arr1[x1] * arr2[x2] * arr3[x3];
}
*/

int main()
{
    for (int i = 0; i < (1 << 16); i++)
        printf("%llu ", arr0[i]);
}

如果要编译的话这段代码需要几分钟,主要是因为那个 constexpr 大概需要算 2162^{16} 个数。
但是如果把 constexpr 去掉那么 1s 内跑完。
是什么造成了这种差距

回复

9 条回复,欢迎继续交流。

正在加载回复...