当前位置:首页 » 服务存储 » 静态变量存储和回收
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

静态变量存储和回收

发布时间: 2023-08-14 18:31:56

① 静态变量有何特点如何存取静态变量

静态变量的类型说明符是static。静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量,例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由static加以定义后才能成为静态外部变量,或称静态全局变量。

对于自动变量,它属于动态存储方式。但是也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式。由此看来,一个变量可由static进行再说明,并改变其原有的存储方式。

常量使用

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

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

以上内容参考:网络-静态变量

② 变量的静态存储与动态存储

首先,静态存储与动态存储都是变量在内存中的存储方式。

c语言中变量分为局部变量(auto)、寄存器变量(register)、全局裤如变量(extern)、静态变量(static)。局部变量和寄存器变量在内存中以动态存储的方式存储,外部变量和静态变量在内存中以静态存储的方式存储。(笔者注:C语言不存在真正意义上的“全局变量”。被习埋纯搜惯性误称为“全局变量”的,一般是文件作用域对象。参考: 全局变量-维基网络 )

静态存储的变量存储在内存的静态区,在整个程序的生命周期内不被释放。动态存储的变量在程序执行的过程中才分配存储位置,使用完成后便被释放。

静态存储的变量如果在声明后没有被初始化,则系统会根据数据类型自动将其初始化为“0”或‘\0’。动态存储的变量如果在声明后没有被初始化,那么它的值是弯历不确定的。

③ c/c++(2)

1、全局静态变量、局部静态变量

2、静态函数。只能在 本源文件 中使用

3、c++中,static关键字可以定义 类 中的静态成员变量。类中static静态数据成员拥有一块独立的单独存储区,而不管创建了多少个该类的对象。这些对象共享这一块静态存储区。

4、c++中,static关键字可以定义 类 中的静态成员函数。静态成员函数也是类的一部分,而不是对象的一部分。这些对象共享这一块静态存储区

1、数组是用来存储多个相同类型的集合。数组名是首元素的地址。

2、指针相当一个变量,它存放的是其他变量在内存中地址。指针名只想内存的首地址。

区别:
1、赋值

2、存储方式:

数组:连续存放、连续内存。不是在静态区就是在栈上。

指针:灵活、内存空间不确定。

3、初始化

4、指针操作

数组名的指针操作:

定义:指向函数的指针。

应用:回调

c语言:全局或者静态变量,初始化发生在任何代码执行之前,属于编译期初始化。

c++:全局或者静态对象当且仅当对象首次用到时才进行构造。

解析:

作用域 :C++里作用域可分为6种: 全局 , 局部 , 类,语句 , 命名空间 和 文件作用域 。

静态全局变量 :全局作用域+文件作用域,所以无法在其他文件中使用。

静态局部变量 :局部作用域,只被初始化一次,直到程序结束。

静态局部变量 :局部作用域,只被初始化一次,直到程序结束

生命周期 :静态全局变量、静态局部变量都在静态存储区,直到程序结束才会回收内存。类静态成员变量在静态存储区,当超出类作用域时回收内存。

答:能。

原因: 因为在 编译时对象 就绑定了 函数地址 ,和指针空不空没关系。

定义 : 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)

产生原因 : 释放内存后指针不及时置空(野指针),依然指向了该内存,那么可能出现非法访问的错误。这些我们都要注意避免。

避免办法:

1、初始化置为NULL;

2、申请内存判空;

3、指针释放后置空;

4、使用智能指针;

1、首先从作用域考虑 :C++里作用域可分为6种: 全局 , 局部 , 类 , 语句 , 命名空间 和 文件 作用域。

全局变量 :全局作用域,可以通过 extern 作用于其他非 定义的源文件

静态全局变量 :全局作用域+文件作用域,所以 无法在其他 文件中使用。

局部变量 :局部作用域,比如函数的参数,函数内的局部变量等等。

静态局部变量 :局部作用域,只被 初始化一次,直到程序结束

2、从所在空间考虑 :除了 局部变量在栈上 外,其他都在静态存储区。因为静态变量都在静态存储区,所以下次调用函数的时候还是能取到原来的值。

3、生命周期 : 局部变量在栈上,出了作用域就回收内存 ;而全局变量、静态全局变量、静态局部变量都在静 态存储区,直到程序结束才会回收内存。

区别:

1、宏不是函数 ,省去压栈退栈过程,提高效率。 内联函数本质是一个函数 , 并且内联函数本身不能直接调用自身。

2、 宏函数 是在预编译的时候把所有的宏名用宏体来替换,简单的说就是字符串替换。 而内联函数 则是在编译的时候进行代码插入,编译器会在每处调用内联函数的地方直接把内联函数的内容展开,这样可以省去函数的调用的开销,提高效率。

3、 宏定义 是没有类型检查的,无论对还是错都是直接替换; 而内联函数 在编译的时候会进行类型的检查,内联函数满足函数的性质,比如有返回值、参数列表等。

1、赋值顺序不同 :++ i 是先加后赋值;i ++ 是先赋值后加;++i和i++都是分两步完成的。

2、效率不同 :后置++执行速度比前置的慢

3、 i++ 不能作为左值,而++i 可以

4、 两者都不是原子操作