const变量何时初始化?

When is const variable initialized

本文关键字:初始化 何时 变量 const      更新时间:2023-10-16

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

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

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

类的const static成员

如果是用常量表达式初始化的简单类型,则在静态初始化阶段,在运行任何用户代码之前对其进行初始化。

否则,如果它是具有非平凡构造函数的类类型,或者具有非常量初始化器,则在动态初始化阶段对其进行初始化。这将发生在调用在同一翻译单元中定义的任何函数之前;但也有潜在的死亡陷阱:
  • 在其他静态变量初始化之前可能不会发生;如果它们的构造函数访问它,你会得到邪恶的bug。
  • 如果在不同的单位中定义,它可能不会在main开始之前发生。
  • 如果您从不调用同一单元中的任何函数,则可能根本不会发生。

如果是静态的,则在程序第一次到达其定义时初始化。如果它是自动的,则在每次程序到达它时初始化它,并在超出作用域时销毁它。

3) const全局变量

与第一个相同。它们都具有静态存储时间,因此根据相同的规则初始化和销毁。

指出:

既然你问的是两种不同的语言:在C语言中,没有"动态初始化"这样的东西,所有非局部静态变量在任何用户代码运行之前都被初始化。

const对变量何时或如何初始化没有影响。

存储持续时间告诉您在程序中分配和释放变量时适用哪些规则。要回答您的问题,请指定您提到的每种情况的存储时间。

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

存储时间说明:

自动存储时间

变量在封闭代码块的开头分配最后被释放。所有非全局变量都有这种存储空间持续时间,除了声明为static, extern或thread_local的。

静态存储时间

该变量在程序开始时被分配,在程序开始时被释放程序结束。该变量只存在一个实例。所有全球变量有这样的存储时间,加上那些用static声明的或者是走读生。

线程存储时间

该变量在线程启动时被分配,在线程启动时被释放线结束了。每个线程都有自己的变量实例。只有声明为thread_local的变量才有这个存储时间。Thread_local可以与static或extern一起出现以进行调整联系。(因为c++ 11)

动态存储时间

通过使用dynamic对每个请求分配和释放变量内存分配函数。