编译器在哪里存储常量数组?

Шах*_*Шах 3 c++ arrays

也许这是一个愚蠢的问题。但我想了解它,找不到答案。当我写如下的东西时:

int test[1000000] = {0};
Run Code Online (Sandbox Code Playgroud)

这个数组会包含在编译后的程序代码中吗?还是仅保留该阵列可用内存的指令?

我想了解C ++在这种情况下是在二进制代码中包含所有数组的值还是在运行时分配内存?

das*_*ght 5

这个问题的答案在很大程度上取决于所使用的数据格式。

例如,当你写这个

int test[1000000] = {1, 2, 3};
Run Code Online (Sandbox Code Playgroud)

并使用产生ELF可执行文件的编译器,编译器会发出的数据1, 2, 3,但将段的大小设置为sizeof(test)。当ELF可执行文件加载到内存中时,加载程序将存储1, 2, 3在前四个ints中,并将剩余部分归零。有关ELF在数据部分中尾随零的处理的更多详细信息,请参见此问答

其他可执行文件格式也具有类似的功能:基本上,它们不是在文本部分中存储零,而是存储指令以供加载器留出一些静态内存,并在执行程序之前将其清除。

注意:答案假定test是在全局范围内分配的。

  • @ghostman从您的描述中听起来,您正在使用的可执行格式对节的大小有限制。一旦超过该限制(例如,通过声明`1000000000`整数),编译器将被迫生成具有不同布局的文件-例如,使用另一部分,切换到更大的部分大小,等等。看起来您的可执行文件似乎无法达到但是,该数组的大小是因为13 KB仍比yoru数组的大小小,在32位整数的系统上,yoru数组的大小为4 GB。 (2认同)