【问题标题】:Initializing arrays, potentially unforseen consequences?初始化数组,潜在的不可预见的后果?
【发布时间】:2018-06-10 05:33:50
【问题描述】:

我最近观察到,通过初始化数组,垃圾值全部被空终止符替换。这似乎无关紧要,但是在大型程序中,我认为将资源用于清理数组并不可取。现在要明确一点,我不编写大型程序,这就是我问的原因,我只是一个初学者。但是,如果使用得当,只要始终有一个明确放置的终止符,垃圾值就可以完全正常。

那么,我应该将始终初始化我的数组视为圣经,还是应该考虑是否可以不触及垃圾值?

【问题讨论】:

    标签: arrays string c++11 cin


    【解决方案1】:

    这是因为它是 C++ 规范1 §11.6.2 的一部分,该规范讨论了使用字符串字面量初始化字符(或宽字符)数组的行为:

    如果初始化器的数量少于数组元素的数量,则每个未显式初始化的元素都应为 零初始化 (11.6)。

    无论如何,关于计算成本:

    当您在全局(不是函数范围)中初始化数组时,它通常会位于可执行文件的 .data 段中,并通过直接从可执行映像复制内存页来初始化,而不是通过插入字节的指令来初始化在初始化期间一次内存。页面要么在程序加载时被复制,要么是demand-paged,再次以页面级别的粒度。

    在这种情况下,由于必须初始化整个存储,因此专门用零对其进行初始化不会产生额外成本。

    1 我找不到官方规范的良好非付费副本。此引用来自draft,位于第 228 页(每页页脚)或第 242 页(每 PDF 分页)。

    【讨论】:

    • 感谢您的详细解答!但是这个可执行的“图像”是什么,这不是我以前很难用的术语,我试过维基百科,但我什至不确定我在找什么。 . . .我对学习程序的架构非常感兴趣,当然还有计算机,所以我真的不想错过任何东西。没有一个真正方便的地方来学习你所知道的一切吗?
    • @GoodBoy 可执行映像只是操作系统运行的文件。我的工作基于 Linux 术语/概念;在 Linux 的情况下,g++ 输出的是 a.out 文件(或简单的可执行文件)。对于 Windows,它将是 .exe 文件,但我不确定 Windows 是否使用相同的映射/页面复制来初始化内存段。我没有机会深入阅读它,但this 可能会提供更多关于 Windows 如何做到这一点的信息。
    • 只是关于标准的说明:ISO 很小心地为官方标准收取报酬,但您可以在github.com/cplusplus/draft.git 找到已发布的内容,详细跟踪开发并生成最新版本。对于初学者来说,乍一看可能有点吓人,但它提供了一个有用的想法。
    猜你喜欢
    • 2020-05-07
    • 2022-08-19
    • 2020-10-24
    • 1970-01-01
    • 2013-12-18
    • 2017-08-01
    • 2021-12-01
    • 2022-08-23
    • 1970-01-01
    相关资源
    最近更新 更多