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

时间:2016-03-18 17:07:43

标签: c++ arrays

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

int test[1000000] = {0};

此数组是否包含已编译的程序代码?或仅指示保存此阵列的可用内存?

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

1 个答案:

答案 0 :(得分:4)

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

例如,当你写这个

int test[1000000] = {1, 2, 3};

并使用生成ELF可执行文件的编译器,编译器发出1, 2, 3的数据,但将该部分的大小设置为sizeof(test)。当ELF可执行文件加载到内存中时,加载程序将1, 2, 3存储在前四个int中,并将剩余部分归零到最后。 See this Q&A for more details on ELF's handling of trailing zeros in a data section

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

注意:答案假定test已在全球范围内分配。