【发布时间】:2018-06-10 05:33:50
【问题描述】:
我最近观察到,通过初始化数组,垃圾值全部被空终止符替换。这似乎无关紧要,但是在大型程序中,我认为将资源用于清理数组并不可取。现在要明确一点,我不编写大型程序,这就是我问的原因,我只是一个初学者。但是,如果使用得当,只要始终有一个明确放置的终止符,垃圾值就可以完全正常。
那么,我应该将始终初始化我的数组视为圣经,还是应该考虑是否可以不触及垃圾值?
【问题讨论】:
我最近观察到,通过初始化数组,垃圾值全部被空终止符替换。这似乎无关紧要,但是在大型程序中,我认为将资源用于清理数组并不可取。现在要明确一点,我不编写大型程序,这就是我问的原因,我只是一个初学者。但是,如果使用得当,只要始终有一个明确放置的终止符,垃圾值就可以完全正常。
那么,我应该将始终初始化我的数组视为圣经,还是应该考虑是否可以不触及垃圾值?
【问题讨论】:
这是因为它是 C++ 规范1 §11.6.2 的一部分,该规范讨论了使用字符串字面量初始化字符(或宽字符)数组的行为:
如果初始化器的数量少于数组元素的数量,则每个未显式初始化的元素都应为 零初始化 (11.6)。
无论如何,关于计算成本:
当您在全局(不是函数范围)中初始化数组时,它通常会位于可执行文件的 .data 段中,并通过直接从可执行映像复制内存页来初始化,而不是通过插入字节的指令来初始化在初始化期间一次内存。页面要么在程序加载时被复制,要么是demand-paged,再次以页面级别的粒度。
在这种情况下,由于必须初始化整个存储,因此专门用零对其进行初始化不会产生额外成本。
1 我找不到官方规范的良好非付费副本。此引用来自draft,位于第 228 页(每页页脚)或第 242 页(每 PDF 分页)。
【讨论】:
g++ 输出的是 a.out 文件(或简单的可执行文件)。对于 Windows,它将是 .exe 文件,但我不确定 Windows 是否使用相同的映射/页面复制来初始化内存段。我没有机会深入阅读它,但this 可能会提供更多关于 Windows 如何做到这一点的信息。