C++ 在线提交的编译文件太大[202493852字节]错误
在使用二维数组时,我尝试使用静态数组将-1分配给它的第一个元素:C++ 在线提交的编译文件太大[202493852字节]错误,c++,C++,在使用二维数组时,我尝试使用静态数组将-1分配给它的第一个元素: intdp[5001][5001]={-1}//将dp[0][0]设置为-1 内部计算(内部i,内部j){ //这里正在进行一些利用dp阵列的操作。 } int main(){ cout当您使用初始值设定项声明静态数组时,如 整个数组被放入可执行文件的一个数据部分。它的大小是编译器的(5001×5001=25010001)×sizeof(int)。如果sizeof(int)==8,那么数组的字节大小200080008接近您引用的限
intdp[5001][5001]={-1}//将dp[0][0]设置为-1
内部计算(内部i,内部j){
//这里正在进行一些利用dp阵列的操作。
}
int main(){
cout当您使用初始值设定项声明静态数组时,如
整个数组被放入可执行文件的一个数据部分。它的大小是编译器的(5001×5001=25010001)×sizeof(int)
。如果sizeof(int)==8
,那么数组的字节大小200080008接近您引用的限制。最后二进制文件中还有其他内容
另一方面,第二个示例中没有初始值设定项的数组
int dp[5001][5001];
在可执行文件中没有分配任何数据空间;相反,只有一条小记录告诉加载程序在进程启动时在进程的地址空间中分配一个零初始化的内存块
此优化不是强制性的,但ELF和Windows PE二进制文件都使用它。初始化的数据段通常称为.data
,未初始化的.bss
一个小型的实践性实验,展示以下概念:
// Save me as bss.cc
int without_initializer[10000][10000]; // 100 million elements.
int with_initializer[1000][1000] = { 42 }; // 1 million elements.
/*
Run and see:
$ c++ -c -o bss.o bss.cc
$ ls -l bss.o
-rw-r--r-- 1 kkm kkm 4001008 2021-05-18 06:00:19 bss.o
$ objdump -h bss.o
bss.o: file format elf64-x86-64
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000000 0000000000000000 0000000000000000 00000040 2**0
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .data 003d0900 0000000000000000 0000000000000000 00000040 2**5
CONTENTS, ALLOC, LOAD, DATA
2 .bss 17d78400 0000000000000000 0000000000000000 003d0940 2**5
ALLOC
3 .comment 0000001d 0000000000000000 0000000000000000 003d0940 2**0
CONTENTS, READONLY
$ rm bss.cc bss.o
*/
.data
部分的大小为0x3d0900=4000000字节。显然,此编译器的sizeof(int)
为4。它还具有LOAD
标志,这意味着它的大小为0x3d0900=4000000字节,这在链接的答案中有很好的解释
ls(1)显示,对象文件的大小仅略大于相同的4000000字节,头和小.comment
部分占用了一点额外的空间,可能标识了编译器(如果您很好奇,objdump(1)可以转储其内容)
.bss
部分的大小为0x17d78400=400000000,完全等于sizeof(不带初始值设定项)
。它有ALLOC
标志告诉加载程序它必须在进程的地址空间中,但没有LOAD
标志,这意味着没有任何东西可以从文件加载
您可能会注意到,.bss
部分在文件中正好占用了0个字节:它的偏移量和以下.comment
部分的偏移量都是0x003d0940
使用Linux命令及其ELF格式。在Windows上,如果您手头有Visual Studio,请使用cl/c bss.cc
然后使用dumpbin/headers bss.obj
。除此之外,请注意={-1};
将-1
仅分配给第一个元素,并将0
分配给所有其他元素。你能用codeforges之外的编译器复制它吗?例如,这里。众所周知,在线竞争网站对实际调试毫无用处。我100%相信正确的“解决方案”对于这个codeforces谜题,不管它是什么,都不需要像那样的巨大数组。这就是codeforces拒绝您的解决方案的原因。另外:您应该小心memset
ing整数。memset将它们设置为零很好,memset“将它们设置为-1”很正常要工作,但真的很麻烦。mem将它们设置为任何其他值都会失败。@SamVarshavchik OP说带有int dp[5001][5001]的代码;
在codeforces上运行。(不过OP没有说它被接受)@MikeVine,谢谢,我重新改写了答案。我关注的是初始值设定者是否在场。当然,你是对的。我想准确地回答所问的问题,但措辞有点草率。:)谢谢你提供了这样一个信息丰富的答案。
// Save me as bss.cc
int without_initializer[10000][10000]; // 100 million elements.
int with_initializer[1000][1000] = { 42 }; // 1 million elements.
/*
Run and see:
$ c++ -c -o bss.o bss.cc
$ ls -l bss.o
-rw-r--r-- 1 kkm kkm 4001008 2021-05-18 06:00:19 bss.o
$ objdump -h bss.o
bss.o: file format elf64-x86-64
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000000 0000000000000000 0000000000000000 00000040 2**0
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .data 003d0900 0000000000000000 0000000000000000 00000040 2**5
CONTENTS, ALLOC, LOAD, DATA
2 .bss 17d78400 0000000000000000 0000000000000000 003d0940 2**5
ALLOC
3 .comment 0000001d 0000000000000000 0000000000000000 003d0940 2**0
CONTENTS, READONLY
$ rm bss.cc bss.o
*/