在线提交的编译文件太大[202493852字节]错误
Compiled file is too large [202493852 bytes] error from on-line submission
在使用2-D数组时,我尝试使用一个静态数组,将-1分配给它的第一个元素:
int dp[5001][5001] = {-1}; //setting dp[0][0] to -1
int calc(int i, int j){
//Some operations are happening here which utilize dp array.
}
int main(){
cout << calc(0,0);
}
当我在线提交此代码片段作为解决方案时,我得到了Can't compile file: Compiled file is too large [202493852 bytes]
。
但是,当我尝试在main((中设置dp值时
int dp[5001][5001];
int calc(int i, int j){
//Some operations are happening here which utilize dp array.
}
int main(){
dp[0][0] = -1;
cout << calc(0,0);
}
上面的代码段已成功接受并编译。
有人能解释为什么会发生这种情况吗?
当您使用初始化器(如(声明静态数组时
int dp[5001][5001] = {-1};
整个数组被放入可执行文件的数据部分。它的大小是编译器的(5001×5001=2501001(×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
标志,这意味着它必须从文件中加载,链接的答案中对此有很好的解释。
ls(1(显示,对象文件的大小只比相同的4000000字节大一点,头文件和小的.comment
部分占用了一点额外的空间,可能会识别编译器(如果你很好奇,objdump(1(可以转储其内容(。
.bss
部分的大小为0x17d78400=400000000,正好等于sizeof(without_initializer)
。它有ALLOC
标志来告诉加载程序它必须在进程的地址空间中,但没有LOAD
标志,这意味着没有什么可以从文件中加载的。
您可能会注意到,.bss
节在文件中正好占用0个字节:它的偏移量和以下.comment
节的偏移量都是0x003d0940。
使用Linux命令及其ELF格式。在Windows上,如果您手边有Visual Studio,请在Native Tools命令提示符下使用cl /c bss.cc
,然后使用dumpbin /headers bss.obj
。
- 运行时错误:引用绑定到类型"int"的未对齐地址0xbebebebebebebec6,这需要 4 个字节对齐 (stl_vector.h)
- 程序错误地读取了二进制文件的一个字节
- 蓝牙LE:设置字节数组的特征会发送错误的值
- OPENCV错误:不良的参数(字节必须为16、32或64)在简介Descriptorextractorimpl中
- UWP和SerialSample字节编码错误
- ATMega328P 和 ESP8266ex 之间的 I2c 通信只能发送 8 个字节,错误?
- 错误:数组的总大小不得超过0x7fffffff字节
- C++结构到字节*引发错误
- Valgrind 错误:系统调用参数 epoll_pwait(sigmask) 指向不可寻址的字节
- 函数返回的 gsl::span 具有错误的字节
- 使用 libsodium 为 iOS 构建 zeromq,随机字节错误
- strlen() 给出了数组中空字节的错误大小原因
- 比较两个文件的第二个字节时出现分段错误
- 为什么我在使用libusb与PIC 18F2550通信时读取或写入超过3个字节时会出现错误
- C++字符串到字节错误
- setw() 在包含 UTF-8 多字节字符/码位的字符串上输入错误的输出
- 通过取消引用指向字节数组的指针来分配值是错误的吗?
- 字节金币每次都回答错误
- GCC 错误,同时对常量无符号长字节使用代码块
- 使用 AES 解密时错误的 16 个字节