定义大数组时,为什么初始化若干项非 0 值,就会产生编译问题,反之则不会?
  • 板块学术版
  • 楼主Herman526
  • 当前回复28
  • 已保存回复28
  • 发布时间2024/1/6 19:22
  • 上次更新2024/5/11 07:22:32
查看原帖
定义大数组时,为什么初始化若干项非 0 值,就会产生编译问题,反之则不会?
786834
Herman526楼主2024/1/6 19:22

在许多题目中,我们要定义很大的数组才能方便解决,像 P4213,P3383,这增大了爆空间的可能性。比如,我在用这段代码(最大数组长 7.5×1067.5×10^6,总空间约 200MB200\text{MB})做 P4213 时,即使是在 Dev-C++ 上编写代码,无论用哪个编译器,此代码都要花很长时间才编译完(平均大概 30s30\text s)。而交到洛谷上,编译更是死活过不去。但是,我将数组长度调到 5×1055×10^5 后,这种情况就有所好转(比如在洛谷上能过编译)。

但是,P4213 给的内存限制很大,占用 200MB200\text{MB} 空间的数组是完全可以定义的。数组真的无法定义到这么大吗?我写了这段代码尝试在 Dev-C++ 和洛谷 IDE 上编译:

__int128 a[100000000];main(){}

这段代码定义了长达 10810^8 的 __int128 数组,数组规模显然是比上面的 7.5×1067.5×10^6 大得多的,空间占用也多,代码却可以在 Dev-C++ 和洛谷 IDE 上顺利通过编译,还能正常运行(在洛谷 IDE 上,长度甚至可以定义到 10910^9)。然而,如果是下面这段,情况就截然不同了:

int a[5000000]={1};main(){}

虽然这段代码的数组规模较小(5×1065×10^6,比上面的 7.5×1067.5×10^6 还小,空间也仅占用了较少),在编译时,上述的奇怪情况(Dev-C++ 上编译时间长达 30s30\text s,洛谷 IDE 上有约 12\frac12 的概率编译不成功)却又发生了。并且,在 Dev-C++ 对比这两段代码,我还发现,前一段代码的输出大小极小(<512KiB<512\text{KiB}),后一段的却高达 100MiB100\text{MiB} 左右。因此,我知道了,如果在全局初始化较大数组的某些非 00 值,输出大小就会很大,反之则不会(毕竟我试了好几段都如此)。

不过,知道了这些,我还想知道下面问题的答案:初始化数组若干项为非 00 值,就会增加输出大小,是 C++ 编译器的特性吗(如果是,为什么会产生)?洛谷评测机还说我可以向 https://gcc.gnu.org/bugs/ 上报此情况,那我真的有必要上报吗?

2024/1/6 19:22
加载中...