const变量何时初始化?
When is const variable initialized
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对每个请求分配和释放变量内存分配函数。
相关文章:
- 何时为派生类初始化 vptr?
- c++ 中的异常类何时初始化?
- 何时以及如何初始化和销毁thread_local变量?
- 在运行时,何时完全初始化 std 库才能在不破坏代码的情况下使用它?
- 静态存储中的内联变量何时初始化?
- c++:何时初始化声明的变量而不将其分配给任何值
- 何时分配和初始化变量
- 模板非静态数据成员初始化程序何时实例化
- 声明并初始化指针后,何时在变量文本前面加上星号,何时不作为前缀
- QObject 自定义属性何时从样式表中指定的值初始化
- 初始化引用时何时以及为何获得副本
- 在构造函数的初始化列表中初始化时,何时构造成员对象?
- 何时在C++中使用哪个数据成员初始化
- 何时使用外部链接初始化全局常量,避免静态初始化顺序惨败
- 静态成员何时在 C++ 中初始化
- 在静态初始化期间,pthread线程变量何时开始存在
- 何时初始化静态变量和全局变量
- 指针初始化:何时给初始化的指针赋NULL值
- 何时用256初始化数组
- 聚合的列表初始化:何时可以调用复制构造函数