在许多题目中,我们要定义很大的数组才能方便解决,像 P4213,P3383,这增大了爆空间的可能性。比如,我在用这段代码(最大数组长 7.5×106,总空间约 200MB)做 P4213 时,即使是在 Dev-C++ 上编写代码,无论用哪个编译器,此代码都要花很长时间才编译完(平均大概 30s)。而交到洛谷上,编译更是死活过不去。但是,我将数组长度调到 5×105 后,这种情况就有所好转(比如在洛谷上能过编译)。
但是,P4213 给的内存限制很大,占用 200MB 空间的数组是完全可以定义的。数组真的无法定义到这么大吗?我写了这段代码尝试在 Dev-C++ 和洛谷 IDE 上编译:
__int128 a[100000000];main(){}
这段代码定义了长达 108 的 __int128 数组,数组规模显然是比上面的 7.5×106 大得多的,空间占用也多,代码却可以在 Dev-C++ 和洛谷 IDE 上顺利通过编译,还能正常运行(在洛谷 IDE 上,长度甚至可以定义到 109)。然而,如果是下面这段,情况就截然不同了:
int a[5000000]={1};main(){}
虽然这段代码的数组规模较小(5×106,比上面的 7.5×106 还小,空间也仅占用了较少),在编译时,上述的奇怪情况(Dev-C++ 上编译时间长达 30s,洛谷 IDE 上有约 21 的概率编译不成功)却又发生了。并且,在 Dev-C++ 对比这两段代码,我还发现,前一段代码的输出大小极小(<512KiB),后一段的却高达 100MiB 左右。因此,我知道了,如果在全局初始化较大数组的某些非 0 值,输出大小就会很大,反之则不会(毕竟我试了好几段都如此)。
不过,知道了这些,我还想知道下面问题的答案:初始化数组若干项为非 0 值,就会增加输出大小,是 C++ 编译器的特性吗(如果是,为什么会产生)?洛谷评测机还说我可以向 https://gcc.gnu.org/bugs/ 上报此情况,那我真的有必要上报吗?