首页 > 编程知识 正文

c语言静态变量的特点,静态变量初始化只初始化一次吗

时间:2023-05-06 17:12:23 阅读:132700 作者:4692

感谢上面两位同学的回答。 结合自己的咨询和测试,整理了最终的结果。 贴在这里。 如果有错误的地方,请指出来。 谢谢你。

静态变量的内存分配和初始化

对于c语言全局和静态变量,无论是否初始化,如果初始化的内存空间是全局的,则初始化将在执行任何代码之前发生,并且是编译时初始化。 由于内置变量不需要资源释放操作,只需回收内存空间,因此程序结束后,全局内存空间将一起回收,没有变量依赖问题,不执行任何代码。

c引入了对象。 这给全局变量的管理带来新的麻烦。 c中的对象必须生成构造函数,并最终执行析构函数操作。 由于结构和析构函数并不像分配内存那样简单,而且相当复杂,因此全局或静态对象(c )的结构和析构函数何时运行? 这需要执行相关的代码,并且在编译时无法完成,因此在c标准中,全局或静态对象仅在首次使用对象时构建,并在atexit ()中管理对象的生命周期,而

总结:

全局变量、文件域静态变量和类静态成员变量在main运行之前的静态初始化过程中分配内存并初始化。 局部变量(通常是函数中的静态变量)在首次使用时分配内存并初始化。 这里的变量包含内置数据类型和自定义类型的对象。

说明静态变量初始化的线程安全

非局部静态变量通常被认为是线程安全的,通过在执行main之前的静态初始化过程中分配和初始化存储器

在编译过程中,编译器的实现是通过在初始化语句之前设置本地静态变量的标识符来确定本地变量是否已初始化。 每次执行时判断,需要初始化时执行初始化操作,否则不执行。 这个进程本身不是线程安全的。

C 11标准针规定本地静态变量初始化需要保证线程的安全性,具体说明如下。

ifcontrolentersthedeclarationcurrentlywhilethevariableisbeinginitialized,theconcurrentexecutionshallwaitforcompletiononofthed

这也是有保证的,因为许多新编译器支持C 11标准,但许多早期版本的编译器并不完全支持,因为在C 03标准之前没有此说明。

注意:在VS2008中测试多线程时,只有一个线程执行初始化,但未初始化的线程不会等待初始化完成,而是立即返回未正确初始化的静态对象。

为了初始化局部静态变量的线程安全,g编译器的实现与使用全局锁控制局部静态变量的id相同。 id用于确定是否已初始化。 详情请参阅: http://www.cn blogs.com/xuxm 2007/p/4652944.html

相关使用方法:

以前的标准没有规定本地静态变量初始化在并发模式下是否安全,许多早期版本的编译器没有处理并发安全问题。 因此,在不支持C 11标准的编译环境中,多线程程序最好不要使用需要显式初始化的本地静态变量(对象),如果需要像单实例模式一样使用,则可以使用全局罗这是因为本身存在结构问题,并且当多个线程获取实例时,一个线程可能会锁定对象结构。 另一个线程避开结构,如果锁定对象未完全结构化,则将其锁定。 此时的动作取决于锁定的实现,一般的实现没有问题,但毕竟不严密。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。