gpt4 book ai didi

c++ - 静态变量和全局变量什么时候初始化?

转载 作者:IT老高 更新时间:2023-10-28 12:34:39 30 4
gpt4 key购买 nike

C++ 我知道 staticglobal 对象是在 main 函数之前构造的。但是如你所知,在C中,在main之前并没有这样的initialization procedure

例如,在我的代码中:

int global_int1 = 5;
int global_int2;
static int static_int1 = 4;
static int static_int2;
  • 这四个变量何时初始化
  • 54 等初始化值在编译期间存储在哪里?初始化时如何管理?

编辑:
澄清第二个问题。

  • 在我的代码中我使用5初始化 global_int1,那么编译器如何assign 5global_int?例如,也许编译器首先将 5 值存储在某处(即表),并在初始化开始时获取该值。
  • 至于“初始化时如何管理它们?”,它真的很模糊,我自己还没有如何解释。有时,解释一个问题并不容易。由于我还没有完全掌握这个问题,所以忽略它。

最佳答案

通过静态和全局对象,我想你的意思是对象在命名空间范围内定义的静态生命周期。当此类物体使用本地范围定义,规则略有不同。

正式地,C++ 分三个阶段初始化这些变量:1.零初始化2.静态初始化3.动态初始化该语言还区分需要的变量动态初始化,以及那些需要静态的初始化:所有静态对象(静态对象生命周期)首先零初始化,然后是静态对象初始化被初始化,然后动态初始化发生。

作为一个简单的第一近似,动态初始化意味着必须执行一些代码;通常,静态初始化没有。因此:

extern int f();

int g1 = 42; // static initialization
int g2 = f(); // dynamic initialization

另一个近似是静态初始化是C 支持什么(对于具有静态生命周期的变量),动态其他一切。

编译器如何做到这一点当然取决于初始化,但在基于磁盘的系统上,其中可执行文件从磁盘加载到内存中,静态的值初始化是磁盘上图像的一部分,并已加载直接由系统从磁盘。在经典的 Unix 上系统,全局变量会被分成三个“段”:

文本:
代码,加载到写保护区。静止的`const` 类型的变量也将被放置在这里。
数据:
带有静态初始化器的静态变量。
bss:
无初始化器(C 和 C++)或动态的静态变量初始化(C++)。可执行文件不包含此图像段,并且系统在之前将其全部设置为“0”开始你的代码。

我怀疑很多现代系统仍然使用某些东西类似。

编辑:

补充一点:以上指的是C++03。对于现有程序,C++11 可能不会改变任何东西,但它确实添加 constexpr (这意味着一些用户定义的函数仍然可以是静态初始化)和线程局部变量,这打开了一个全新的蠕虫 jar 头。

关于c++ - 静态变量和全局变量什么时候初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17783210/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com