为什么G 5.4不能编译此编译时质数代码


#include<iostream>
using namespace std;
template<int N> class Prime
{ // generate N prime numbers at compile time
public:
    unsigned int arr[N]{};
    constexpr Prime() {
        int k=0;
        for(unsigned int i=2; k<N; i++) {
            bool isPrime = true;
            for(int j=0; j<k; j++) {
                if(arr[j] > i/2) break;
                if(i % arr[j] == 0) {
                    isPrime = false;
                    break;
                }
            }
            if(isPrime) arr[k++] = i;
        }
    }
};
int main()
{
    Prime<50000> prime; // if 50000->5000, ok
    for(auto& a : prime.arr) cout << a << ' ';
}

g 无法编译此代码。它花费了很长时间试图编译,使用大量内存,最后只是崩溃。

如果我将数字50000较小,或者摆脱constexpr,则它会编译。但是我想使用更大的阵列节省时间。

任何想法都将不胜感激。

这是实施质量(QOI)。来自草稿标准

附件B(信息性)实现数量[抗击]

1因为计算机是有限的,因此C 实现不可避免 他们可以成功处理的程序的大小有限。 每个实施都应记录已知的限制。 该文档可能会引用固定限制存在的位置,例如 计算可变限制作为可用资源的函数,或说 固定限制不存在或未知。

2限制可能会限制包括所描述的数量 下面或其他。每个数量之后的括号数是 推荐作为该数量的最小值。但是,这些 数量仅是指南,不确定合规性。

(2.38) - 递归constexpr函数Invocations [512]。

(2.39) - 在核心常数表达式中评估的全表达 [1 048 576]。

您的算法超过了在核心常数表达式内评估的全表达的极限。请注意,GCC确实超过了最低要求,因为您的循环量表为1/2 * N^2和GCC将其编译为N = 5,000。我找不到有关海湾合作委员会的已记录的硬限制。不幸的是,与具有-fconstexpr-steps的Clang不同,您不能覆盖GCC的ConstexPR评估数量。

结论:向GCC提交绩效报告或使用Clang(您的示例编译)。

最新更新