为什么G 5.4不能编译此编译时质数代码
Why can g++ 5.4 not compile this compile-time prime number code?
#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(您的示例编译)。
相关文章:
- 在Linux for Windows上编译C++代码时出错
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在程序中编写脚本来编写和编译代码
- 未定义的引用 .. 使用 OpenCV 编译 C++ 代码时,从命令行
- 在macos上编译代码的未解析符号
- 使用个人C++库编译代码时,与头文件一起使用时会中断
- 使用指针编译代码后,.cpp文件将变为随机字符
- VS Express 无法正确编译代码(?
- 如何在Ubuntu中使用Visual Studio代码编译C++代码
- 使用 Android NDK 使用 clang++ 编译C++代码时对"_Unwind_Resume"的未定义引用
- 无法使用两个包装不同下一层的ssl_stream编译代码
- 编译代码时"[Warning] extra tokens at end of"
- 无法编译代码,因为它已在 C++11 中弃用
- 如何在 Azure 应用服务中使用 cl.exe 编译 C++ 代码并生成可执行文件
- 如何调试编译 c++ 代码的 bazel?
- 为什么在使用转换构造函数编译代码时需要 const 复制构造函数?
- 编译 C++ 代码后尺寸较大
- 使用用 C++ 和 DDS 编写的 CMAKE 编译代码
- 编译代码时如何不制作二进制文件?
- 如何使用所有其他文件信息来编译代码,例如HAAR级联训练的权重的XML文件