gpt4 book ai didi

c++ - 检查位集大小时出现段错误

转载 作者:行者123 更新时间:2023-11-28 02:41:24 25 4
gpt4 key购买 nike

当我尝试运行下面的代码时出现段错误。我尝试注释掉部分代码,发现条件为 j < is_prime.size() 的 while 循环是罪魁祸首。这让我感到困惑,因为我在其上方的 for 循环中的相同值之间执行了相同的检查,但没有出现段错误。

有人可以向我解释这里的问题是什么吗?

我在 Linux 64 上使用 GCC 4.8.2。

#include <bitset>
#include <iostream>
using namespace std;

const size_t max_pandigital = 987654321;

int main()
{
bitset<max_pandigital/3> is_prime;
is_prime.set(); // assume all numbers are prime
is_prime[0] = false; // 1 is not prime
for(size_t i = 1; i < is_prime.size(); i++) {
if(is_prime[i]) {
int n;
if(i%2 == 0) n = 3*i+1;
else n = 3*i+2;
size_t j = i;
if(j%2 == 0) j += n-2;
else j += n+2;
while(j < is_prime.size()) {
is_prime[j] = false;
if(j%2 == 0) j += n-2;
else j += n+2;
}
}
}
//cout << is_prime[899809363/3] << endl;
}

编辑:我实现了一些建议的更改。这是一个工作版本 - 运行时间约为 13 秒。我认为最大的瓶颈是为 bool vector 分配 42MB。谢谢!

#include <iostream>
#include <vector>
using namespace std;

const size_t max_pandigital = 987654321;

int main()
{
vector<bool> not_prime(max_pandigital/3);
not_prime[0] = true; // 1 is not prime
for(size_t i = 1; i < not_prime.size(); i++) {
if(~not_prime[i]) {
int n;
if(i%2 == 0) n = 3*i+1;
else n = 3*i+2;
size_t j = i;
if(j%2 == 0) j += n-2;
else j += n+2;
while(j < not_prime.size()) {
not_prime[j] = true;
if(j%2 == 0) j += n-2;
else j += n+2;
}
}
}
cout << not_prime[899809363/3] << endl; // prime
cout << not_prime[100017223/3] << endl; // pseudoprime
}

最佳答案

如果注释掉的部分被注释掉,并且我运行了你的代码,那么由于堆栈溢出,我得到了一个段错误。 (即使代码仍然被注释掉,堆栈仍然溢出,这解释了您所看到的)。

典型系统默认堆栈大小为 1 兆字节;但是您的 bitset 需要大约 40 MB 的存储空间。

要解决此问题,您可以:

  • 动态分配你的bitset
  • 使用不同的容器,例如 vector<bool>
  • 告诉您的环境使用更大的堆栈大小

动态分配的一个例子可能是:

unique_ptr< bitset<max_pandigital/3> > ip { new bitset<max_pandigital/3> };
auto &is_prime = *ip;

其余代码相同。

关于c++ - 检查位集大小时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25861003/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com