C ++编译需要永远

时间:2019-01-01 07:01:16

标签: c++

我在Windows上使用gcc编译器编译了以下简短的C ++代码

userdefaults

上面的代码使用Eratosthenes筛子打印出小于1e9的质数,并且没有任何错误, 但是我注意到,与其他C ++程序的编译时间相比,编译所需的时间更长, 完成大约几分钟后,没有任何错误消息。 验证一下,再次编译时得到的结果相同。 即使很奇怪,在编译之后,该代码也不会打印任何内容,并返回退出代码0。 我不明白发生了什么。 是什么导致了这种奇怪的行为?

1 个答案:

答案 0 :(得分:8)

首先,它不是并发症(您的程序不是一流的,而是简单的),而是compilation

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

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

如果您不是通过静态初始化全局变量,而是仅在main函数内部进行初始化,则

bool prime[MAXN];
int main() {
  prime[2] = true;

生成的可执行文件很小-大约17 KB(因为现在prime位于.bss segment中)并且编译时间约为0.45秒。

如果您想初始化prime中的 all 元素,则在初始化一系列元素时应使用for循环(或某些std::memset)设置为相同的值)。

您应该在编码之前先进行更多的思考。阅读有关prime numbersprimality tests的信息。您不需要这么大的prime数组,因为您要循环√ MAXN次(这是您需要的最大索引),即31623次。因此,您只可以声明bool prime[32000];(并将程序更改为仅使用该范围内的元素)。

实际上,当您需要大量内存时,最好使用heap memory

如果使用C ++进行编码,请利用其标准containers

当然,请阅读How to debug small programs

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

根据n.m.的评论,您的原始程序具有undefined behavior(应为scared),因为primes[MAXN]元素不存在(您有{{3} }),但您错误地使用了它。因此,将内部<= MAXN替换为< MAXN或声明bool prime[MAXN+1];