也许这是一个愚蠢的问题。但我想要了解它并找不到答案。当我写下如下的smth时:
int test[1000000] = {0};
此数组是否包含已编译的程序代码?或仅指示保存此阵列的可用内存?
我想了解在这种情况下C ++是否包含二进制代码中的所有数组值,还是在运行时分配内存?
答案 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
已在全球范围内分配。