如何通过编译器在C中初始化(到零)数组?

T'n*_*n'E 4 c arrays initialization

免责声明:我可能误解了如何创建,分配和初始化数组.如果是这样,请尝试在两行之间阅读.

如果我通过做创建一个数组

int array[15] = {0};
Run Code Online (Sandbox Code Playgroud)

array编译器的所有元素都将元素初始化为0.这是如何通过编译器完成的?编译器是否插入一个循环来迭代分配的内存并将每个元素设置为零?尺寸会影响性能吗?即初始化双倍大小(30)的数组需要更长的时间吗?多久了?双?对数?2的力量?

只是出于好奇而退出.

wer*_*dle 5

我假设你在谈论全局变量/数组.

实际上,它不是编译器任务(如果我们谈论的是现代操作系统).编译器只是将此对象标记为零初始化.

然后,链接器将此对象放入部分,该部分应使用零初始化.在ELF中,此部分已命名.bss.通常,此部分没有数据(因为只有零),但它有大小.

然后,当加载程序将程序加载到内存中时,它知道它应该将属于.bsssection的内存清零.

如果我们讨论基于堆栈的(本地)变量,那么编译器只是调用 memset()

  • @LightnessRacesinOrbit - 实际上,我确实读过它,并且理解得很好.很感兴趣,所以在我的C99编译器中尝试了它(具有全局和本地范围).没有显式初始化程序,即:`{}`,编译错误状态非法表达式.顺便说一下非常好的答案,但我认为除了gcc(有几个非标准的扩展名),这都行不通.(当然不包括C++) (2认同)