#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(您的示例编译)。