一个C++程序占用的内存分为几个部分:
栈区 (stack)
存放函数的返回地址、函数的参数值、局部变量值。连续的内存区域。
由编译器自动分配释放。
堆区 (heap)
由程序员分配释放,调用malloc, new, delete. 若程序员不释放,操作系统在程序结束时回收。 存放内容随程序员的便。(与数据结构中的堆不是一回事,分配方式类似于链表。内存空间不连续。)
全局区/静态区
全局变量和静态变量存放在一起,初始化的全局变量和静态变量在同一块区域,未初始化的全局变量和静态变量在相邻的区域。
由操作系统在程序结束时释放。
文字常量区
存放常量字符串
由操作系统在程序结束时释放。
程序代码区
存放函数体的二进制代码。
分配效率
栈区比堆高的多。(由于计算机的底层支持,分配专门的寄存器、专门的压栈出栈指令)
碎片
堆会造成大量的碎片
而栈不会存在碎片
生长方向
堆向上,向着内存地址增加的方向。
栈向下。
常用栈。
当分配大量内存空间时,堆好一点。
全局变量
只需在一个源文件中定义,就可作用于所有源文件。(需用extern声明)
静态全局变量
与全局变量的区别:如果程序包含多个文件,静态全局变量作用于定义它的文件,不能作用到其他文件,即被static修饰过的变量具有文件作用域。
局部变量
只在函数执行期间存在。函数的一次调用执行结束后,变量被撤销,所占内存被收回。
静态局部变量
只对定义自己的函数体可见。
全局变量、静态全局变量、静态局部变量,都在静态存储区分配空间;
而局部变量在栈里分配空间。