Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;编译需要很长时间 我在Windows 下用GCC编译器编译下面的短C++代码 #include <iostream> #define MAXN 1000000009 using namespace std; bool prime[MAXN] = {true}; int main() { for (int p = 2; p * p <= MAXN; ++p) if (prime[p]) { cout << p << "\n"; for (int i = p * p; i <= MAXN; i += p) prime[i] = false; } return 0; } #包括 #定义最大值100000009 使用名称空间std; 布尔素数[MAXN]={true}; int main() { 首先,对于(int p=2;p*p_C++ - Fatal编程技术网

C++;编译需要很长时间 我在Windows 下用GCC编译器编译下面的短C++代码 #include <iostream> #define MAXN 1000000009 using namespace std; bool prime[MAXN] = {true}; int main() { for (int p = 2; p * p <= MAXN; ++p) if (prime[p]) { cout << p << "\n"; for (int i = p * p; i <= MAXN; i += p) prime[i] = false; } return 0; } #包括 #定义最大值100000009 使用名称空间std; 布尔素数[MAXN]={true}; int main() { 首先,对于(int p=2;p*p

C++;编译需要很长时间 我在Windows 下用GCC编译器编译下面的短C++代码 #include <iostream> #define MAXN 1000000009 using namespace std; bool prime[MAXN] = {true}; int main() { for (int p = 2; p * p <= MAXN; ++p) if (prime[p]) { cout << p << "\n"; for (int i = p * p; i <= MAXN; i += p) prime[i] = false; } return 0; } #包括 #定义最大值100000009 使用名称空间std; 布尔素数[MAXN]={true}; int main() { 首先,对于(int p=2;p*p,c++,C++,),它不是一个复杂的问题(您的程序不是一流的,而是简单的),而是一个复杂的问题 在我的Linux桌面上(使用i5-4690s和Debian/Sid),用g++p.cc-o p.bin编译不太理想的代码大约需要8.2秒(当然不是永远) 为什么要花这么多时间?因为你有一个初始化但巨大的全局变量(你的prime布尔数组)。因此编译器必须生成一个巨大的二进制可执行文件(大约1 GB,其中大部分是二进制文件) 如果您没有静态地初始化该全局函数,而只是在main函数中,通过 bool prime[MAXN]

),它不是一个复杂的问题(您的程序不是一流的,而是简单的),而是一个复杂的问题

在我的Linux桌面上(使用i5-4690s和Debian/Sid),用
g++p.cc-o p.bin
编译不太理想的代码大约需要8.2秒(当然不是永远)

为什么要花这么多时间?因为你有一个初始化但巨大的全局变量(你的
prime
布尔数组)。因此编译器必须生成一个巨大的二进制可执行文件(大约1 GB,其中大部分是二进制文件)

如果您没有静态地初始化该全局函数,而只是在
main
函数中,通过

bool prime[MAXN];
int main() {
  prime[2] = true;
生成的可执行文件变得很小,大约17KB(因为现在
prime
位于中),编译时间约为0.45秒

如果要初始化
prime
中的所有元素,应使用
for
循环(或者在将一系列元素初始化为相同值时使用一些循环)

在编码之前,你应该多想一想。阅读和。你不需要这么大的
prime
数组,因为你在循环
√ MAXN
次(这是您需要的最大索引),即31623次。因此您可以声明
bool prime[32000];
only(并将程序更改为仅使用该范围内的元素)

实际上,当你需要大量的内存时,你最好使用它

如果C++中编码,则利用其标准。 当然,阅读

顺便说一句,你的程序效率很低。运行大约需要10秒钟(作为
p.bin>/tmp/p.out
,重定向到
/tmp/p.out
,得到3401行)。相比之下,BSD
primes
程序(在我的Debian上的
/usr/games/primes
),当以primes 2 31608>/tmp/pp.out运行时,生成完全相同的输出文件需要不到2毫秒的时间,因此运行速度比您的快近5000倍


正如您的原始程序所评论的(您应该是),因为
primes[MAXN]
元素不存在(您有一个),但您错误地使用了它。因此,请替换内部
您的程序具有未定义的行为。
prime
数组中没有索引为
MAXN
的元素。
bool prime[MAXN]={true};
不会将所有元素都设置为true。这也可能是编译速度慢的原因。需要设置的值很多。请检查输出文件的大小。它可能很大。请注意,您的
MAXN
可能太大。请阅读更多关于和的信息。要查找所有小于1e10的素数,您只需要一个大小数组1e5@StoryTeller Clang不会在我的机器上崩溃。也许Cyru限制了内存。考虑不要初始化<代码> Prime<代码>。它是一个全局的,所以它会自动设置为false。然后反转程序逻辑,程序将false作为素数。注释SMOURF从这一点疯狂中解释为什么要这样做。它应该加快BU的速度。我花了很多时间。