静态局部变量何时出现

When does static local variable comes into existence?

本文关键字:何时出 局部变量 静态      更新时间:2023-10-16

Robert Lafore 的 c++ 面向对象编程一书说:

静态局部变量具有自动局部变量的可见性 变量(即,在包含它的函数内部(。然而,它的 生存期与全局变量的生存期相同,不同之处在于它 直到第一次调用函数时才存在 包含它。此后,它一直存在到生命的一生 程序

在第一次调用函数后出现意味着什么?静态本地的存储是在程序加载到内存中时分配的。

存储是在输入main之前分配的,但是(例如(如果静态对象具有具有副作用的 ctor,则这些副作用可能会延迟到第一次调用函数之前。

但请注意,情况不一定如此。常量初始化只需要在输入该块之前发生(不一定只是在执行"跨越"该定义时(。同样,在某些情况下,允许实现比所需的更早初始化其他块范围的静态变量(如果你想深入了解情况的血腥细节,你可以看看 [basic.start.init] 和 [stmt.dcl],但它基本上归结为:只要它不影响初始化它的值。例如,如果您有类似以下内容:

    int i;
    std::cin >> i;
    { 
        static int x = i;

。在输入块之前,实现将无法初始化x,因为初始化它的值在他们之前是未知的。另一方面,如果您有:

{ 
     static int i = 0;

。实现可以根据需要尽早执行初始化(并且大多数将/基本上将在编译时执行这样的初始化,因此它根本不涉及在运行时执行任何指令(。然而,即使对于不太平凡的情况,在逻辑上可行的情况下,也允许更早的初始化(例如,该值不是来自以前的执行(。

在C++对象的存储持续时间(当为其分配原始内存时(和对象的生存期是两个独立的概念。作者在谈论物体的"存在"时,显然指的是后者。

在一般情况下,为对象分配存储以使其"存在"是不够的。具有非平凡初始化的对象的生存期在其初始化完成后开始。例如,具有非平凡构造函数的类的对象在其构造函数完成执行之前不会正式"存活"。

静态本地对象的初始化在控件首次传递声明时执行。在此之前,该对象并不正式存在,即使已经为其分配了内存。

请注意,作者的描述并不十分精确。仅仅调用包含声明的函数是不够的。控件必须通过对象的声明才能开始其生存期。如果函数包含分支,则在第一次调用函数时不一定会发生这种情况。

对于具有简单初始化的对象(如int对象(,存储持续时间生存期之间没有区别。对于这样的对象,分配内存是所有需要做的。但一般来说,仅分配内存是不够的。

这意味着函数中的静态变量在第一次调用该函数之前不会被初始化(由构造函数或赋值运算符(。

一旦包含静态局部变量的函数被称为静态局部变量,静态局部变量就被初始化了。