【问题标题】:Difference between 'global' and 'static global'“全局”和“静态全局”之间的区别
【发布时间】:2010-10-31 21:17:22
【问题描述】:

全局变量的作用域是所有文件,而静态全局变量的作用域只是它所在的文件被宣布。为什么这样?

全局或静态全局变量存储在内存中的什么位置?

【问题讨论】:

    标签: c memory variables standards


    【解决方案1】:

    有一些混淆,因为 C 中的 static 可能意味着两个不同的东西。一是静态存储时长,二是内部联动。 static 用作文件范围内的关键字将给出与内部链接一起使用的函数或对象。

    函数或对象的内部链接意味着如果您在另一个“文件”中声明另一个函数(这实际上不是称为“文件”,而是翻译单元 - TU),那么该声明将引用 a不同 功能:在该单元中声明的名称将“链接”到与在该翻译单元中声明的名称不同的实体,该名称是该翻译单元的“内部”。这同样适用于对象。

    无论文件范围变量是否使用static 声明,它仍然具有静态存储持续时间:这意味着它存在于整个程序中,并在程序终止时消失。具有静态存储持续时间的对象的另一个示例是字符串文字。没有指定存储具有静态存储持续时间的对象的位置,但通常根据它们是否已初始化来存储它们:初始化的文件范围变量通常存储在名为“.data”的部分中,而非初始化的文件-范围变量通常存储在名为“.bss”的部分中。请记住,如果变量未初始化,它将在程序开始时初始化为零:“.bss”部分通常由程序启动时的实现初始化为零。

    我在任何地方都说“通常”,因为没有指定存储东西的位置。例如,某些实现可以将字符串文字存储在只读部分中。如果你有一个文件范围指针并且不初始化它,实现会将它初始化为一个空指针,它不一定是一个全为空字节的对象:)

    【讨论】:

    • 这个答案似乎很难理解!
    【解决方案2】:

    它们都存储在数据段中;不同之处在于全局具有外部可见的链接器符号,而静态全局则没有。

    【讨论】:

      【解决方案3】:

      全局变量的作用域在所有文件中。而静态全局变量的作用域只是声明它的文件。为什么会这样?

      全局变量旨在可从任何模块访问 - 这种做法被认为是不好的做法,只有在绝对必要时才应使用。

      文件范围的静态变量(我假设你说“静态全局”时所说的)可以由单个编译单元(通常是文件)中的例程访问 - 这样做的原因是限制它的范围.在修改使用该变量的代码时,您需要查看哪些其他例程可能受到影响的位置有一个很好的限制。它还减少了名称冲突的机会。

      使用全局变量时,如果另一组模块碰巧也出于不同目的使用了同名的全局变量,则您必须修改其中一组以使用不同的名称。静态变量不存在这个问题。

      【讨论】:

        【解决方案4】:

        不能从其他文件访问静态全局变量,而可以使用 extern 关键字访问全局变量。

        【讨论】:

          【解决方案5】:

          关于静态和全局的面试问题要记住的要点

          1. 为静态变量分配的内存只分配一次,即所有对象由同一内存共享,但对于全局变量,内存是为每个对象分配的。
          2. 静态变量和全局变量的生命周期和范围不同。首先,让我解释一下什么是生命和范围。对象的生命周期决定了对象是否仍在内存中,而对象的范围是它是否可以通过其名称访问变量。a)对象可能是活动的,但不可见(不在范围内)b)如果对象不存在但在范围内(通过指针引用对象的动态分配对象除外)。
          3. 全局变量具有全局范围,我的意思是它可以被任何函数从任何文件访问,而静态变量具有文件范围,不能从任何其他文件访问该变量。当您想要使该文件的所有函数都可以访问变量但另一个文件的函数不能访问时,这种技术很有帮助。

          【讨论】:

            【解决方案6】:

            C 标准没有指定它们在内存中的存储位置,这与 C 程序员无关。访问变量的能力由编译器和链接器控制。

            这是您就该主题区域提出的第二个问题。使用像 C 这样相对高级的编程语言的主要原因之一是您不必担心这些问题。

            【讨论】:

            • 作为一名嵌入式系统工程师,我想我应该担心。在一次采访中我被问到了同样的问题
            【解决方案7】:

            我们使用静态属性来隐藏模块内的变量和函数声明,就像我们在 Java 和 C++ 中使用公共和私有声明一样。 C 源文件扮演模块的角色。使用 static 属性声明的任何全局变量或函数都是该模块私有的。类似地,没有静态属性声明的任何全局变量或函数都是公共的,并且可以被任何其他模块访问。尽管使用 'global' 关键字定义为变量或函数是一种很好的做法。

            这两个变量都存储在可重定位文件的 .data 或 .bss 部分中。

            【讨论】:

            • Objective-C 使用的 C 语言无法识别“全局”关键字。 “未知类型名称‘全球’”。您是否参考了具有“全局”关键字的 C 版本?
            猜你喜欢
            • 2018-12-22
            • 1970-01-01
            • 2016-08-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-10-06
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多