在C\C++中,通常可以把内存理解为4个分区:栈、堆、全局/静态存储区和常量存储区。下面我们分别简单地介绍一下各自的特点。
1栈
栈里边存放的变量在编译期间就能确定其存储大小,他们在函数作用域内创建,离开函数作用域后会被自动销毁。
栈里边的变量一般为:局部变量,函数参数。并且他们的存储空间也是和定义的顺序一样,如果两个变量先后定义,那么他们的存储空间就是连续的,挨着的。而且栈的大小也是有限的,一般来说通常Visual C++编译器的默认栈的大小为1MB,所以不要定义int a[1000000]这样的超大数组。
2堆
堆一般用来存储那些在编译期间不能确定存储大小的变量,他们的内存空间也是不一定连续的,一般由malloc(new)来分配内存块,由free(delete)来释放内存。存放在堆中的变量用完之后必须释放,否则会造成内存泄露。连续用两个malloc开辟的内存空间不一定是紧挨这的,所以会产生内存碎片。还有一点是堆的大小几乎不受限制,理论上堆可以达到4GB.
3全局or静态存储区
这个存储区用来存放在编译期间就能确定存储大小的变量,而且这些变量是在程序运行的整个期间都可见得全局变量和静态变量。
4常量存储区
用来存放编译期间能确定存储大小的常量,而且在程序运行期间,存储区内的常量是全局可见的。里边的常量不许被修改。
另外一个不常解析的:5程序代码区
存放函数的二进制代码。
表1 栈和堆的对比
栈 | 堆 | |
存储内容 | 局部变量 | 变量 |
作用域 | 函数作用域、语句块作用域 | 函数作用域、语句块作用域 |
编译期间大小是否确定 | 是 | 否 |
大小 | 1MB | 4GB |
内存分配方式 | 地址由高向低减少 | 地址由低向高增加 |
内容是否可以修改 | 是 | 是 |
| 全局/静态存储区 | 常量存储区 |
存储内容 | 全局变量、静态变量 | 常量 |
编译期间大小是否确定 | 是 | 是 |
内容是否可以修改 | 是 | 否 |