https://blog.csdn.net/czy47/article/details/90737468
https://blog.csdn.net/cherrydreamsover/article/details/81627855
一.内存管理
深度截图_选择区域_20201120094259.png- 栈:
由编译器自动分配与释放,存放为运行时函数分配的局部变量、函数参数、返回数据、返回地址等。其操作类似于数据结构中的栈。 - 堆
new分配的内存块,由程序控制其释放时机,一般一个new对应一个delete。如果程序没有释放,在程序结束后,操作系统会自动回收。 - 全局区/静态存储区
全局变量和静态变量被分在同一块内存中,存放全局变量、静态变量。程序结束后,由系统释放。
c++不再区分:已初始化全局区(data)和未初始化全局区(bss)。他们共同占有同一块内存区。 - 常量存储区
存放常量字符串,这是一块比较特殊的存储区,里面存放的是常量,不允许修改。 - 自由存储区
malloc分配的内存块,和堆十分相似。不过使用free来结束自己的生命。 - 代码区
存放函数体(类成员函数和全局区)的二进制代码。
二.静态全局变量、全局变量、静态局部变量、局部变量的区别
- 全局变量、静态全局变量
全局变量之前加上static,就变成静态全局变量。区别:
- 全局变量属于常量区,静态全局变量自然也属于常量区;
- 非静态全局变量的作用域:整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的;而静态全局变量则限制其作用域,即只在定义该变量的源文件内有效,统一源程序的其他源文件中不能使用它。
- 由于静态全局变量的作用域,局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其他源文件中引起错误。
- 局部变量、静态局部变量
- 静态局部变量是属于常量区,而函数内部的局部变量是属于栈区;
- 静态局部变量的销毁时机是程序结束,但是别的函数调用不了该变量,局部变量随该函数结束而结束。
- 如果定义这两个变量时没有初始值时,静态局部变量会自动初始化位0,而局部变量是一个随机值。
- 静态局部变量再编译期间只赋值一次,以后每次函数调用时,都不再赋值。局部变量再调用期间,每调用一次,赋值一次。
3.普通函数、静态函数
- static函数和普通函数的作用域不同。static函数的作用域仅在本文件,只在当前源文件中使用的函数应该声明位内部函数(static),内部函数应该再当前源文件中说明和定义。
- 对于可在当前源文件外使用的其他函数,应该在一个头文件中声明。要使用这些函数的源文件包含这个头文件。
总结:
局部变量改成静态局部变量后,改变了其存储方式。即改变了其声明周期;把全局变量改成静态全局变量,改变了其作用域,限制了其使用范围。
- static全局变量和普通全局变量的区别:static全局变量只初始化一次,防止再其他文件单元中被引用。
- static局部变量和普通变量的区别:static局部变量只被初始化一次,下一次依据上一次的结果值。
- static函数和普通函数的区别:static函数在内存中只有一份,普通函数再每个被调用中维持一份复制品。
网友评论