TypechoJoeTheme

鱼一的博客 ◡̈

yuyi

知不可乎骤得,托遗响于悲风
网站页面
标签搜索
c++

c++变量初始化

在C++中,全局变量和静态变量(包括静态局部变量和静态全局变量)的初始化行为需要更精确地区分和理解。这里是详细说明:

全局变量和静态全局变量的初始化

  • 全局变量和静态全局变量在程序启动时,即进入main函数之前被初始化。这种初始化是按照它们定义的顺序进行的,但这个顺序只在同一个编译单元(通常是一个源文件)内是确定的。跨编译单元的初始化顺序是未定义的。这意味着,如果一个全局变量依赖于另一个编译单元中全局变量的值,那么这种依赖关系是危险的,因为你不能保证两者的初始化顺序。

静态局部变量的初始化

  • 静态局部变量则是在它们首次用到时才初始化,这一点是正确的。这通常指的是第一次执行到包含该静态局部变量的代码块时。C++11标准确保了这种初始化是线程安全的。

动态初始化和静态初始化

  • 静态初始化:对于某些情况,编译器可以在编译时期完成初始化(如直接用常量初始化的静态存储期变量)。
  • 动态初始化:如果变量的初始化依赖于运行时计算的结果,则其初始化为动态初始化,发生在程序启动阶段(对于非局部静态存储期变量)或者首次使用该变量时(对于局部静态变量)。

示例

#include <iostream>

int global_var = 10; // 静态初始化

int getNumber() {
    return 5;
}

int main() {
    static int static_global_var = getNumber(); // 动态初始化,但在main函数之前
    std::cout << "Global var: " << global_var << std::endl;
    std::cout << "Static global var: " << static_global_var << std::endl;

    return 0;
}

void func() {
    static int static_local_var = getNumber(); // 在首次调用func时动态初始化
}

在这个示例中,global_varstatic_global_var在程序启动时被初始化,其中global_var是静态初始化的,而static_global_var的初始化可能需要在运行时进行,但仍然发生在main函数执行之前。static_local_var的初始化则会在函数func首次被调用时进行。

因此,总结说全局变量和静态变量在“首次用到时才进行初始化”的描述只准确地适用于静态局部变量。其他静态存储期变量(包括全局变量和静态全局变量)通常在程序启动时初始化,具体时机取决于它们是否能够被静态初始化或者需要动态初始化。

赞(0)
版权属于:

鱼一的博客 ◡̈

本文链接:

https://yuyi.monster/archives/246/(转载时请注明本文出处及文章链接)

评论 (0)

More Info for me 📱

IP信息

人生倒计时

今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月