静态局部变量何时出现
When does static local variable comes into existence?
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
对象(,存储持续时间和生存期之间没有区别。对于这样的对象,分配内存是所有需要做的。但一般来说,仅分配内存是不够的。
这意味着函数中的静态变量在第一次调用该函数之前不会被初始化(由构造函数或赋值运算符(。
一旦包含静态局部变量的函数被称为静态局部变量,静态局部变量就被初始化了。
- 使用的未初始化局部变量'Quick'
- 修复未初始化的局部变量错误
- 局部变量保留函数中的值
- 如何使用 C++ 中的继承函数访问派生类中的局部变量
- 将引用分配给局部变量,如果局部变量超出范围,它会超出范围吗?
- Gnuplot_i.hpp C++接口绘制局部变量而不是文件
- 如何在函数外部访问函数中局部变量的值?
- 赋予全局变量而不是局部变量优先级的函数 - (异常行为)
- C++中静态方法的局部变量范围
- 未初始化的局部变量错误甚至认为我初始化了它(C++)
- 离开范围后如何保护局部变量的值?
- 局部变量名称冲突
- C++ lambda:如何'freeze'局部变量的值?
- 我应该使我的局部变量常量还是可移动的
- 获取具有静态局部变量的绑定/推断捕获 lambda 的函数指针
- 如果函数抛出的异常可能未捕获,如何销毁局部变量?
- 从函数中引用局部变量不会给出错误
- 如何在 C++ 中将不可复制的局部变量移出 lambda
- 静态局部变量何时出现
- 使用 'new int[n]' 声明新数组时,为什么它没有出现在局部变量列表中?