当前位置:首页 > 数码 > 静态变量中的圈套-C-防止意在行为的指南 (静态变量中的非静态变量)

静态变量中的圈套-C-防止意在行为的指南 (静态变量中的非静态变量)

admin7个月前 (04-29)数码35

函数中的static变量

static变量的作用

C++中static关键字的最后一个用途是在函数内创立部分变量,这些变量在其作用域内分开和进入时坚持其值。函数内的static变量相似于只能从该函数访问的全局变量。static变量的一个经常出现用途是记住特定函数能否已口头过某个特定的初始化。例如,经常使用这种技术的代码或者看起来像这样:

voidperformTask(){staticboolinitialized{false};if(!initialized){cout<<"initializing"<<endl;//口头初始化。initialized=true;}//口头希冀的义务。}

但是,static变量或者会惹起混杂,通常有更好的方法来结构你的代码,以防止经常使用它们。在这种状况下,你或者想编写一个类,其中结构函数口头所需的初始化。

留意:防止经常使用独立的static变量。改为在对象内保养形态。但是,有时它们可以是有用的。一个例子是用于成功Meyer的单例设计形式

留意:performTask()的成功不是线程安保的;它蕴含了竞态条件。在多线程环境中,你须要经常使用原子操作或其余机制来同步多个线程。

静态变量中的非静态变量

非部分变量的初始化顺序

静态数据成员和全局变量的初始化

在分开static数据成员和全局变量的主题之前,思考这些变量的初始化顺序。程序中的一切全局变量和static类数据成员都在mn()开局之前初始化。在给定源文件中的变量依照它们在源文件中产生的顺序初始化。例如,在以下文件中,保障Demo::x在y之前被初始化:

classDemo{public:staticintx;};intDemo::x{3};inty{4};

但是,C++对不同源文件中非部分变量的初始化顺序没有提供规范或保障。假设在一个源文件中有全局变量x,在另一个源文件中有全局变量y,你无法知道哪个会先初始化。通常,这种不足规范不会惹起关注。但是,假设一个全局或static变量依赖于另一个,则或者会有疑问。

回顾一下,对象的初始化象征着运转它们的结构函数。一个全局对象的结构函数或者会访问另一个全局对象,假定它曾经结构。假设这两个全局对象在两个不同的源文件中申明,你不能指望一个在另一个之前结构,也不能管理初始化顺序。这个顺序或者因不同的编译器或同一编译器的不同版本而异,甚至当你只是在名目中增加另一个文件时,顺序也或者扭转。

正告:不同源文件中非部分变量的初始化顺序是未定义的。

非部分变量的销毁顺序

非部分变量的销毁顺序与它们被初始化的顺序同样。不同源文件中的非部分变量以未定义的顺序初始化,这象征着它们的销毁顺序也是未定义的。


c语言中的static是什么意思?

static在c语言中是私有、静态意思。

用于在函数中声明“静态变量”用,在每一次调用后,该变量并不在函数返回时立即释放,变量中保存的值,可以保留到下一次调用时继续有效。

静态就是一直存在,相对于每次调用动态分配而言。static函数未验证是否每次调用代码地址都是一致的。static全局变量生命周期到程序或进程结束。static局部变量生命周期到程序或进程结束。

static的使用和作用

静态全局变量。全局变量前面加static,修饰全局变量为静态全局变量,改变全局变量的可见性。静态函数。函数返回类型前加static,修饰函数为静态函数,改变函数的可见性。

类的静态成员。类成员前加static,修饰类的成员为类的静态成员,实现多个对象之间的数据共享,并且使用静态成员不会破坏封装性,也保证了安全性。类的静态函数,类函数前加static,修饰类的函数为静态函数,减少资源消耗,不需要实例化就可以使用。

c语言中静态变量需要自己释放?那外部变量属于静态存储方式,书上说静态变量的生存期是整个程序的运行期

对,一个运行的程序属于一个进程,进程是由操作系统管理的,程序结束了,该程序所占用的资源会由操作系统来回收。

静态变量的静态:变量占用的存地址不释放,也就是说它的地址它从头到尾一内直占着,容不给其他内存单元占用而已,其本身的值是可以改变的。

动态的变量:比如调用函数体里定义的变量,在函数执行后便释放出去,把有用的地址资源贡献给其他量,释放以后如果你用指针来打印这个地址的值的话,就很有可能不是原来的值了。

扩展资料:

静态变量也可以用于存储常数。具体来说,静态变量(全局变量及汇编语言里定义的符号亦同)可用const,constant或final(根据语言决定)等关键字标识,这时其值就会在编译时设定,并且无法在运行时改变。

编译器通常将静态常量与文本一起置于目标文件的文本区域,而非常量初始化数据则置于数据区;而如若有需要,有些编译器还可选择为其开辟专用区;为防止常数变量被错误的指针写入覆盖,亦可在这块区域启用内存保护机制。

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: C

“静态变量中的圈套-C-防止意在行为的指南 (静态变量中的非静态变量)” 的相关文章

深化探求模板编程的精华-从类型参数到智能推导-模板的艺术-C-把握 (深化探求模板范文)

深化探求模板编程的精华-从类型参数到智能推导-模板的艺术-C-把握 (深化探求模板范文)

类型模板参数 在示例中,模板有一个模板参数:存储在网格中的类型。编写类模板时,您须要在尖括号内指定参数列表,例如: 这个参数列表相似于函数或方法中的参数列表。与函数和...

提升性能的新利器-17中的并行功能-C (提升 性能)

提升性能的新利器-17中的并行功能-C (提升 性能)

C++17扩展了STL(Standard Template Library,标准模板库)以支持并行算法。这意味着许多常见的算法,如std::sort、std::for_each、std::tran...

开源项目-助初学者进阶成长-C-八个 (开源项目有什么用)

开源项目-助初学者进阶成长-C-八个 (开源项目有什么用)

通过参与或阅读开源项目的源代码,你可以获得丰富的实践机会。实际的项目代码比简单的教程更具挑战性,可以帮助你深入理解 C++ 的各种概念和技术。 ThreadPool 一个简单...

让新手也能轻松把握-C-类模板特化与承袭经常使用指南 (请问新手)

让新手也能轻松把握-C-类模板特化与承袭经常使用指南 (请问新手)

一、类模板特化 1.特化的成功 你可以为特定类型提供类模板的替代成功。例如,你或许以为constchar类型(C格调字符串)的Grid行为没无心义。Grid<constchar&...

了解圈套和无效经常使用技巧-言语变长参数-C (了解圈套和无线的区别)

了解圈套和无效经常使用技巧-言语变长参数-C (了解圈套和无线的区别)

C工具 变长参数列表 这局部解释了旧的C格调变长参数列表。了解这些内容很关键,由于你或许会在遗留代码中遇到它们。但是,在新代码中,你应该经常使用变参模板来成功类型安保的变长参数列表。...

的区别-中-C-math.h-和-cmath (的区别中的钱)

的区别-中-C-math.h-和-cmath (的区别中的钱)

一、引言 C++规范库中的<cmath>和C言语规范库中的<math.h>均为数学函数库,它们提供了一系列数学函数和常量。但是,这两者之间存在一些关键的区别...

与设计形式-可裁减的代码-C-打造可保养 (设计与形式的关系)

与设计形式-可裁减的代码-C-打造可保养 (设计与形式的关系)

引言 C++是一种弱小的编程言语,它提供了许多工具和库以支持面向对象编程和通用编程。设计形式是一种用于处置特定疑问的经过验证的处置打算。C++的灵敏性和设计形式的广泛...

深入学习-C-掌握内存管理的艺术 (深入学习习总书记系列讲话精神)

深入学习-C-掌握内存管理的艺术 (深入学习习总书记系列讲话精神)

简介 内存管理是学习任何编程语言的必备知识,C++也不例外。C++ 是一门功能强大、底层控制能力强的编程语言,尤其适用于系统级开发、游戏开发和嵌入式系统等领域。与一些更简单的编程语言相比,学...