【问题标题】:why is "static" both storage class and linkage specifier?为什么存储类和链接说明符都是“静态的”?
【发布时间】:2014-05-20 14:51:01
【问题描述】:

static 关键字定义变量如何存储在内存中,即如果已初始化则存储在数据段中,如果未初始化则存储在 BSS 中。但该关键字还指定如何链接变量,即仅限本地范围。

这两件事如何或为什么相关?两者可以分开,还是这是必要的设计考虑?

IOW,为什么如果我希望我的变量在程序期间存在,它必须在内部链接?

【问题讨论】:

  • 不,static 关键字没有指定变量是否应该在 databss 段中,它只是决定的初始化状态(对于使用段的系统,例如databss)。
  • 但这不就是效果吗?已初始化或未初始化的静态变量分别存储在 Data Segment 和 BSS 中,不是吗?即使这是一个实现细节,不一定是标准规定的。
  • 局部变量(默认自动)存储在堆栈中,因此是局部变量。全局变量在整个程序生命周期中都是活跃的。 (您在程序期间存在但具有外部链接的变量)如果您添加带有局部变量的静态关键字,其范围保持不变,但生命是直到程序结束。如果使用全局变量添加静态关键字,生命保持不变,但链接是内部的。
  • @MohitJain 是的,我想这是我的问题......为什么会这样?在您提到的示例中,关键字似乎做了两件非常不同的事情。我很好奇他们为什么不使用两个不同的关键字。我敢肯定有一个很好的理由(好吧,无论如何都会希望),我只是不明白它是什么。
  • 对于“为什么静态意味着它在 C++ 中的作用”的大多数答案是:“因为 C 是这样定义的。”当它最初是在 C 中定义的时候,将编译器安装到内存中就已经是一个挑战,因此最小化关键词几乎是必要的。

标签: c++ static


【解决方案1】:

关键字static 可能被视为有些“过载”。

以下使用选项都是可行的:

  • 静态局部变量
  • 静态全局变量
  • 静态成员变量
  • 静态全局函数
  • 静态成员函数

变量:

就运行时而言,所有类型的静态变量本质上是相同的。它们都驻留在程序的数据部分中,并且它们的地址在整个程序执行过程中保持不变。所以它们之间的唯一区别是在编译期间,在声明的范围内:

  • 静态局部变量:编译器只能在函数范围内识别
  • 静态全局变量:编译器只能在文件范围内识别
  • 静态成员变量:编译器只能在类的范围内识别

功能:

就运行时而言,所有类型的函数(静态和非静态)本质上是相同的。它们都驻留在程序的代码段中,并且它们的地址在程序的整个执行过程中保持不变。所以它们之间的唯一区别是在编译期间,在声明的范围内:

  • 静态全局函数:编译器仅在文件范围内识别
  • 静态成员函数:编译器只能在类的范围内识别

【讨论】:

  • re “文件范围”,C++ 没有。 C 有一个“文件范围”的概念,在 C++ 中是命名空间范围,就在任何函数或类之外。但即使是 C 概念也不指代任何特定文件,并且翻译单元通常(在实践中)由多个文件组成,由预处理器组合在一起。 C++ 甚至不要求源代码在文件中。也许用“翻译单元”替换“文件”可以挽救事情。
【解决方案2】:

回复

“为什么如果我希望我的变量在程序期间存在,它必须在内部链接?”

不,事实并非如此。

支持程序全局变量,这是非const 命名空间级别变量的默认设置。避免它们是明智的(尽可能)。


单个关键字static 中的概念明显混为一谈,因为 C++ 不支持动态库,所以本地到翻译单元链接对于比程序执行更短的生命周期没有意义。

【讨论】:

    猜你喜欢
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 2010-09-23
    相关资源
    最近更新 更多