C++中静态局部变量的生存期是什么?是贯穿整个程序还是从调用该函数开始到整个程序结束?

我想知道它的生存期什么时候开始的

局部静态变量是在函数内的局部作用域的具有静态存储期(static duration)的对象。一个局部静态变量的生存期开始于该变量被初始化时自动构造(此过程中如果有构造函数则调用构造函数)完毕后,结束于整个程序结束时自动销毁(此过程中如果有析构函数则调用析构函数)前一刻。
以下是直接理论依据参考:
标准明确程序终止时自动销毁静态存储期对象:
3.6.3 Termination [basic.start.term]
1 Destructors (12.4) for initialized objects of static storage duration (declared at block scope or at namespace scope) are called as a result of returning from main and as a result of calling exit (18.3). These objects are destroyed in the reverse order of the completion of their constructor or of the completion of their dynamic initialization. If an object is initialized statically, the object is destroyed in the same order as if the object was dynamically initialized. For an object of array or class type, all subobjects of that object are destroyed before any local object with static storage duration initialized during the construction of the subobjects is destroyed.
标准指出静态存储期对象保持到程序结束:
3.7.1 Static storage duration [basic.stc.static]
1 All objects which neither have dynamic storage duration nor are local have static storage duration. The storage for these objects shall last for the duration of the program (3.6.2, 3.6.3).
关于对象(包括变量)的生存期(lifetime),标准有如下明确定义:
3.8 Object Lifetime [basic.life]
1 The lifetime of an object is a runtime property of the object. The lifetime of an object of type T begins when:
— storage with the proper alignment and size for type T is obtained, and
— if T is a class type with a non-trivial constructor (12.1), the constructor call has completed.
The lifetime of an object of type T ends when:
— if T is a class type with a non-trivial destructor (12.4), the destructor call starts, or
— the storage which the object occupies is reused or released.
关于声明局部的静态存储期对象的初始化的方式(零初始化)和时机(在其它非静态对象初始化之前,一般实现为第一次进入函数时):
6.7 Declaration statement [stmt.dcl]
4 The zero-initialization (8.5) of all local objects with static storage duration (3.7.1) is performed before any other initialization takes place.
相关概念参考:
关于存储期,标准有如下定义:
3.7 Storage duration [basic.stc]
1 Storage duration is the property of an object that defines the minimum potential lifetime of the storage containing the object. The storage duration is determined by the construct used to create the object and is one of the following:
— static storage duration
— automatic storage duration
— dynamic storage duration
零初始化的定义:
8.5 Initializers [dcl.init]
5 To zero-initialize an object of type T means:
— if T is a scalar type (3.9), the object is set to the value of 0 (zero) converted to T;
— if T is a non-union class type, each nonstatic data member and each base-class subobject is zeroinitialized;
— if T is a union type, the object’s first named data member89) is zero-initialized;
— if T is an array type, each element is zero-initialized;
— if T is a reference type, no initialization is performed.
关于静态变量的存储,并不完全通过语言控制。标准只规定了静态对象的行为,并没有限制一个实现实际必须怎么存储静态存储期对象。实际的语言实现中,通常给局部静态变量分配的空间会被预先保留,直至程序执行到需要初始化时才访问这些空间,构造结束后局部静态变量的生存期即开始。bluedodo2010 对“生存期”的概念理解有误,注意“分配空间”只是前期的必要条件之一而已。而命名空间作用域的静态存储期对象(例如全局变量)的生存期到确实同程序开始,基本上所有实现中main函数被执行前都会有一段代码来初始化整个程序中用户定义的全局变量以及其它资源(例如标准输出流)。
====
[原创回答团]

参考资料:原创 + ISO/IEC 14882:2003

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2018-05-07
静态局部变量存在全局数据区,他直到函数结束也不会消失 ,每次重新调用声明静态变量的函数时,也不会为其重新分配空间,它始终保留在全局数据区,直到程序运行结束追问

就是说整个程序开始的时候,静态局部变量的生存期就开始了?

追答

对,程序一开始运行,生存期就开始了,而且它是在默认的数据区中分配空间的。汇编可以看到

本回答被网友采纳
第2个回答  2011-03-19
在程序结束前,他一直存在!在函数的多次调用中,静态的局部对象会持续存在并保存他的值!
例如:
int fun()
{
static int coutnt = 0;
return ++count;
}
int main()
{
fun();
fun();
cout << fun() << endl;结果会输出3
}

C++中静态局部变量的生存期是什么?是贯穿整个程序还是从调用该函数开...
局部静态变量是在函数内的局部作用域的具有静态存储期(static duration)的对象。一个局部静态变量的生存期开始于该变量被初始化时自动构造(此过程中如果有构造函数则调用构造函数)完毕后,结束于整个程序结束时自动销毁(此过程中如果有析构函数则调用析构函数)前一刻。以下是直接理论依据参考:标准明确程...

c++中什么是生存期?
生存期:从对象分配到内存开始,到垃圾回收器从内存中删除对象结束这一段时间。析构函数也就是释放内存空间的,也就是析构函数调用之后。

C++问题。
变量的生存期取决于它的 存储类型!从变量的作用域的角度将变量分为局部变量和全局变量两种。局部变量定义在函数体内,函数被调用时,局部变量才临时的被创建,函数执行完后,局部变量自动被销毁;全局变量是定义在整个程序空间内的,在开始运行程序时被创建,整个程序执行完了才会销毁,因此一个变量(无论...

局部静态变量的可见性是怎样的?
回答:1、作为静态变量,它始终有固定的存储空间,从程序开始到程序结束整个生命周期。2、作用域仅限于局部区域,只有在定义自己的函数体内可见。 更多关于变量的信息: ================= 静态全局变量和静态局部变量 C、C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:...

C++成员函数中的静态局部变量能不能提高程序的执行效率
通常栈的大小只有1MB,这个容量可以从编译器的选项上面修改,但这样做通常是无益的。因为局部变量的生存期非常短暂,他只在一个函数的范围内有效,当退出这个函数时,变量就死亡了(也就是所有数据都出栈了),不能再使用,所以这样的临时空间没有必要定义得很大。

C++ 全局变量和全局静态变量有什么区别呢?
2. 全局变量、静态全局变量、静态局部变量都是在静态存储区(全局数据区)中分配空间的,而局部变量是在栈上分配空间的。3. 全局变量、静态变量的生命期和程序生命期是一样的,在程序结束之后操作系统会回收空间。变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念。变量可以通过变量名访问...

C++中函数中的局部变量到底是不是执行到变量定义处才分配内存吗,为什么...
C语言C++语言的局部非静态变量或者局部非静态对象在函数开始执行的时候就分配好了内存空间,但是在到达对象或者变量的定义点之前,是不能对其进行引用的。对于局部非静态对象,构造函数只有到定义点才调用。这些都是实现细节,不是C++标准定义的,所以不同的编译器和系统可能有所不同的实现。在C++语言中,...

c++中两个局部变量和全局变量,变量名相同,请问内存空间如何分配?
句)的地址,然后是函数的各个参数,在大多数的 C 编译器中,参数是由右往左入栈的,然后是函数 中的局部变量。注意静态变量是不入栈的。当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就 是主函数中的下一条指令,程序由该点继续运行。第三点:关于变量的作用域...

问一下C++的局部函数和全局函数是什么意思?
首先介绍一下变量吧,静态变量等就不说了,只说比较一般常见的变量 变量,都是有其生命周期的,像人一样出生,死亡 在一个函数里声明的变量,声明的时候"出生"了,这个函数结束后它也跟着死亡了 而main()函数,它也是一个函数,但是是最主要的函数,因此叫main 一个程序执行的过程,就是从main()的第一行...

关于C++全局变量和局部变量的问题!!
全局变量:一个源程序文件可以包含一个或若干个函数。在所有函数体外部定义的变量为全局变量(或外部变量),全局变量可以被本文件中其他所有的函数调用(使用)。有效作用范围:从定义该变量的位置开始到本程序文件的结束。在同一个文件中,若全局变量和局部变量同名,则在局部变量的作用范围内,全局变量不...

相似回答