- static的作用
(1) 修饰局部变量时,只初始化一次,延长了局部变量生命周期,直到程序结束才释放。
(2)修饰全局变量,全局变量智能在本文件访问,不能在其他文件访问。
(3)修饰函数同修饰全局变量类似,只能在本文件调用,不能在其他文件调用。
(4)不想被释放的时候,可用static修饰。
(5)考虑数据安全性,如当程序需使用全局变量时,应优先考虑static。
2. static全局变量和局部变量的区别?
静态全局变量:
(1)静态变量包况后面的静态局部变量,都在存储在全局/静态区。
(2)未经初始化的静态全局变量会被程序自动出初始化为0.
(3)静态全局变量在声明它的整个文件都可见,本文件之外均不可见,更不可用。(因此,其中的优点是,在其他文件中可以定义相同名字的变量,不会发生冲突。)
静态局部变量:
(1)存储在全局/静态区。
(2)静态局部变量在程序执行到对象声明处首次初始化,以后函数的调用不再初始化。
(3)静态局部变量一般在声明处初始化,如未显示初始化,会被程序自动初始化为0.
(4)静态局部变量始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当其定义的语句和函数结束时,其作用域也结束。
3.内存分区如下图所示:
4. 内存分区的各个分区存储说明:
(1) 栈:
由系统进行内存的管理。主要存放函数的参数以及局部变量,以及const修饰的局部变量以及块变量,在函数完成执行,系统自行释放栈区内存,不需要用户管理。整个程序的栈区的大小可以在编译器中由用户自行设定,VS中默认的栈区大小为1M,可通过VS手动更改栈的大小。
(2) 堆:
由程序员手动申请,手动释放,若不手动释放,程序会一直占用内存,导致内存泄漏,在程序结束后,由系统自动回收,生命周期是整个程序运行期间。使用malloc或者new进行堆的申请,堆的总大小为机器的虚拟内存的大小。
(3) 全局/静态存储区:
全局/静态存储区内的变量在程序编译阶段已经分配好内存空间并初始化。这块内存在程序的整个运行期间都存在,它主要存放静态变量、全局变量和常量。
静态区的特征:
静态区是一个抽象笼统的概念,在实际的Linux/C的可执行程序中并没有静态区这个区域,具体来讲它主要由两个段组成: .data 段和 .bss 段。
.data 段就是程序的数据段,在采用段式内存管理的架构中,数据段(data segment)通常是指用来存放程序中已初始化且不为0的全局变量或静态变量的一块内存区域。
BSS(Block Started by Symbol) 通常是指用来存放程序中未初始化的或初始化为0的全局变量或静态变量的一块内存区域。.data 段在程序编译期间其大小及数据被确定,而.bss段则没有直接分配空间而是由编译器在 .data 段之后为其预留空间,在程序装载进内存时被正式分配。尽管静态区由两个不同的段组成,但是在程序链接并装载进内存之后这两段不做区分。
全局/静态存储区分为.BSS段,全局区/数据区与只读常量区。
① .BSS段:
通常是指用来存放程序中未初始化的全局变量和静态局部变量。该区域会在main函数执行前进行自动清零。BSS是英文Block Started by Symbol的简称。
存储显式初始化为0与未初始化的全局变量(static修饰显式初始化为0与未初始化的局部变量)。
② 数据段(data段):
显式初始化非零的全局变量(static修饰显式初始化非0的局部变量)。
③ 只读常量区:
存放字符串常量,以及const修饰的全局变量。特点是只能读不能写,受到操作系统运行时保护,强行修改会导致 segmentation fault,生命周期同程序运行过程。
5. 总结:
数据区包括:堆,栈,全局/静态存储区;
全 局/ 静态存储区包括:常量区(静态常量区),全局区(全局变量区)和静态变量区(静态区)。 常量区包括:字符串常量区和常变量区;
代码区:存放程序编译后的二进制代码,不可寻址区。
可以说,C/C++内存分区其实只有两个,即代码区和数据区。
- 代码区:存放待执行的代码。