【问题标题】:Must static objects generally be initialized?静态对象通常必须初始化吗?
【发布时间】:2018-02-25 04:00:53
【问题描述】:

来自 Scott 的 Programming Language Pragmatics

对象的生命周期通常对应于三个主体之一 存储分配机制,用于管理对象的空间:

  1. 给静态对象一个绝对地址,在整个程序执行过程中都会保留该地址。

  2. 堆栈对象以后进先出的顺序分配和释放,通常与子例程调用和返回结合使用。

  3. 可以在任意时间分配和释放堆对象。它们需要更通用(也更昂贵)的存储管理 算法。

例如,在 C 中,静态对象必须用常量表达式(可以在编译时计算的表达式)初始化。

我不确定其他语言是否是这样,甚至其他语言也有静态对象。

一般来说,必须初始化静态对象吗?初始化时,是否必须使用可在编译时计算的表达式进行初始化?

通过初始化,我的意思是显式或隐式(即由语言实现自动完成),而不是 uninitializiation。 所以换个说法:一般来说,静态对象可以不被程序或编译器初始化吗?

谢谢。

【问题讨论】:

  • 简短回答是“不”。但是,他们可能应该避免在程序后期出现未初始化的问题。
  • 不完全正确,static 变量默认初始化为 0(或等效值),non static 变量应实际初始化,否则内存堆栈中会出现一些垃圾值。

标签: c programming-languages computer-science lifetime storage-duration


【解决方案1】:

static 变量将自动初始化为“零”,除非您明确初始化它。

除了生命周期或链接部分之外,它与任何其他变量没有什么不同,这意味着您可以像初始化任何其他变量一样初始化它。

【讨论】:

  • 谢谢。通过初始化,我的意思是显式或隐式,而不是 uninitializiation。那么你的意思是必须初始化静态对象吗?
  • @Tim 不,它们将在调用main 之前由“编译器”自动初始化,除非你明确地这样做。
  • 让我重新表述我的问题:一般来说,静态对象可以不被程序或编译器初始化吗?
  • @Tim 在这种情况下,不。它们将始终被初始化(除非您有错误的编译器或启动例程)。参见例如this old answer 引用标准。
  • 据你所知,其他语言是这样的吗?
猜你喜欢
  • 2020-04-30
  • 1970-01-01
  • 2013-01-03
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多