问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-04-29 18:42

我来回答

3个回答

热心网友 时间:2023-10-04 08:04

局部静态变量是在函数内的局部作用域的具有静态存储期(static ration)的对象。一个局部静态变量的生存期开始于该变量被初始化时自动构造(此过程中如果有构造函数则调用构造函数)完毕后,结束于整个程序结束时自动销毁(此过程中如果有析构函数则调用析构函数)前一刻。
以下是直接理论依据参考:
标准明确程序终止时自动销毁静态存储期对象:
3.6.3 Termination [basic.start.term]
1 Destructors (12.4) for initialized objects of static storage ration (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 ration initialized ring the construction of the subobjects is destroyed.
标准指出静态存储期对象保持到程序结束:
3.7.1 Static storage ration [basic.stc.static]
1 All objects which neither have dynamic storage ration nor are local have static storage ration. The storage for these objects shall last for the ration 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 ration (3.7.1) is performed before any other initialization takes place.
相关概念参考:
关于存储期,标准有如下定义:
3.7 Storage ration [basic.stc]
1 Storage ration is the property of an object that defines the minimum potential lifetime of the storage containing the object. The storage ration is determined by the construct used to create the object and is one of the following:
— static storage ration
— automatic storage ration
— dynamic storage ration
零初始化的定义:
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

热心网友 时间:2023-10-04 08:05

静态局部变量存在全局数据区,他直到函数结束也不会消失 ,每次重新调用声明静态变量的函数时,也不会为其重新分配空间,它始终保留在全局数据区,直到程序运行结束追问就是说整个程序开始的时候,静态局部变量的生存期就开始了?

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

热心网友 时间:2023-10-04 08:05

在程序结束前,他一直存在!在函数的多次调用中,静态的局部对象会持续存在并保存他的值!
例如:
int fun()
{
static int coutnt = 0;
return ++count;
}
int main()
{
fun();
fun();
cout << fun() << endl;结果会输出3
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
谷歌浏览器怎么设置成中文_谷歌浏览器设置中文语言 【谷歌浏览器技巧】谷歌浏览器如何更改语言? 史上最全ETF全解 证券ETF是深市的吗 怎样把莲藕肉丸子做的好吃? 高三语文小说赏析小说形象分析与答题技巧 人物形象题答题技巧 借助什么分析小说的人物形象 脖子旁边疼是什么原因 在群里不是好友怎么把群里人建另一个群 那么离婚女孩子一般会判给谁呢? static局部变量的生存期 怎样系鞋带最牢.不易散开 怎么绑鞋带可以比较牢不容易送掉 夫妻离婚女孩一般会判给哪方 华为应用:HwAps 包名:com.huawei.android.hwaps 是什么?可以删吗? 小米三屏幕在不能触摸屏幕的情况下怎样关掉闹钟? 小米4手机怎样取消闹钟? 小米手机怎么取消闹钟设置 什么蓝牙耳机便宜性价比高 华为freebuds2pro耳机充电盒的电池是和手机一样的锂电池吗? 华为freebuds2pro耳机的充电盒里的电池用的是什么电池?是和手机的电池一样的锂电池吗? 小米手机接电话的时候突然闹钟响起怎么关闭闹钟? 小米手机怎样关闭闹钟 女人梦见蛇游走在身上 梦见一条大蛇从田里游走和又细又长的蛇铺过来和地下有蛇 小米手机关机闹钟 梦见蛇在自己身上游走,感觉它好象和自己是一体的,不害怕它,相反感觉亲昵是什么意 梦见蛇在身边游走和老虎在走 周公解梦梦见蛇在身边游走,不咬人胳膊麻木不能动? 静态变量的生存期与整个程序的生存期相同对不对 什么是静态变量,静态变量=全局变量,动态变量=局部变量吗?? 静态局部变量是不是一经初始化,不会再第二次初始化? 静态变量的生存期 静态变量有何特点?如何存取静态变量? C语言静态局部变量和全局变量有什么区别? C++中静态局部变量的生存期什么时候开始 静态变量的变量特点 静态局部变量的生命周期 东京中央区的日文地址翻译==急!!! C语言如何证明静态局部变量胡生命期是全局的 静态是什么意思 日本天皇现在的住址在东京么? 静态局部变量与全局变量问题 C语言中函数返回什么类型的变量哪些可以是临时,哪些必须是静态或全局 在日本东京玩住哪里比较好 谁给我解释下C语言中变量的生命周期 简述变量的作用域与生存周期的含义并根据这两个概念对变量进行... c语言中什么时候用全局变量什么时候用局部变量 东京的邮政编码和区号