【问题标题】:When is const variable initializedconst变量什么时候初始化
【发布时间】:2014-03-27 12:21:06
【问题描述】:

在 C/C++ 中何时以及如何初始化 const 变量?我对特定类型很好奇:

1) const static member of a class
2) function const local variable
3) const global variable

我的意思当然是应用程序运行时而不是初始化它们的源代码方式。

【问题讨论】:

  • 我删除了对 C 的引用,因为 C 没有类。
  • 没有类但其他两点有效。
  • 是的,它们是……但请避免询问“C/C++”。没有这样的语言。 C++ 是 80 年代 C 的超集。我们已经不是 80 年代了,从那时起,C 和 C++ 都发生了无数次的变化。它们不兼容,并且通常表现不同。不同种类的存储持续时间只是一个例子。如果您对两种语言都感兴趣,通常最好将同一个问题问两次,但使用不同的语言选项卡。

标签: c++ c variables constants


【解决方案1】:

1) 类的 const 静态成员

如果它是一个用常量表达式初始化的简单类型,那么它会在静态初始化阶段初始化,在任何用户代码运行之前。

否则,如果它是具有非平凡构造函数的类类型,或者具有非常量初始化器,那么它会在 动态初始化 阶段进行初始化。这将在调用同一翻译单元中定义的任何函数之前发生;但也有潜在的死亡陷阱:

  • 在初始化其他静态变量之前可能不会发生;如果他们的构造函数访问它,你会得到邪恶的错误。
  • 如果它在不同的单元中定义,它可能不会在 main 开始之前发生。
  • 如果您从不在同一个单元中调用任何函数,这可能根本不会发生。

2) 函数常量局部变量

如果它是静态的,那么它会在程序第一次达到其定义时被初始化。如果它是自动的,则每次程序到达它时都会对其进行初始化,并在超出范围时销毁。

3) 常量全局变量

与第一个相同。两者都具有静态存储持续时间,因此根据相同的规则进行初始化和销毁​​。

注意事项:

由于您询问的是两种不同的语言:在 C 中,没有“动态初始化”之类的东西,所有非本地静态变量都在任何用户代码运行之前进行初始化。

const 对变量的初始化时间或方式没有影响。

【讨论】:

  • 即使如果它是一个简单类型,初始化也可能发生在动态初始化阶段——如果初始化器不是一个常量表达式。
  • @AndreyChernyakhovskiy:谢谢,我忘了那个细节。
【解决方案2】:

存储持续时间告诉您分配和释放程序中的变量时适用的规则。回答您的问题是为您提到的每个案例指定存储期限。

1) const static member of a class  : static storage duration,
                                     simple type - static initialisation,
                                     class with non-trivial constructor - dynamic
                                     initialisation
2) function const local variable   : automatic storage duration ( but static 
                                     duration if it is static const),
                                     automatic variable is initialized each time
                                     the code is run,
                                     static variable is initialized the first
                                     time code is run, 
3) const global variable           : static storage duration
                                     simple type - static initialisation,
                                     class with non-trivial constructor - dynamic
                                     initialisation

Explanation 的存储时长:

自动存储时长

变量分配在封闭代码块的开头 并最终解除分配。所有非全局变量都有这个存储 持续时间,但声明为 static、extern 或 thread_local 的除外。

静态存储时长

变量在程序开始时分配,在程序开始时释放 程序结束。该变量仅存在一个实例。全球所有 变量有这个存储持续时间,加上那些用静态声明的 或外部。

线程存储时长

变量在线程开始时分配,在线程开始时释放 线程结束。每个线程都有自己的变量实例。 只有声明为 thread_local 的变量具有此存储持续时间。 thread_local 可以与 static 或 extern 一起出现来调整 连锁。 (C++11 起)

动态存储时长

使用动态分配和释放每个请求的变量 内存分配函数。

【讨论】:

  • 您提供的内容是关于分配而不是初始化。确实,分配必须在初始化之前发生,但不必同时发生。
猜你喜欢
  • 2012-02-01
  • 1970-01-01
  • 2017-04-10
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2019-09-22
  • 1970-01-01
相关资源
最近更新 更多