内存的四大分区

  • Post author:
  • Post category:其他


在C/C++中对于内存分区来说,可以划分为四大内存分区。他们分别是堆、栈、全局/静态存储区和代码区。



1.堆区:

由编程人员手动申请,手动释放,若不手动释放,程序结束后由系统回收,生命周期是

整个程序运行期间

.使用malloc或者new进行堆的申请,堆的总大小为机器的虚拟内存的大小。

new操作符本质上是使用了malloc进行内存的申请,new和malloc的区别如下:   
(1)malloc是C语言中的函数,而new是C++中的操作符。   
(2)malloc申请之后返回的类型是void*,而new返回的指针带有类型。   
(3)malloc只负责内存的分配而不会调用类的构造函数,而new不仅会分配内存,而且会自动调用类的构造函数。



2.栈区:

由系统进行内存的管理。主要存放函数的参数以及局部变量。在函数完成执行,系统自行释放栈区内存,不需要用户管理。整个程序的栈区的大小可以在编译器中由用户自行设定,VS中默认的栈区大小为1M,可通过VS手动更改栈的大小。



3.全局/静态存储区:

全局/静态存储区内的变量在程序编译阶段已经分配好内存空间并初始化。这块内存在程序的整个运行期间都存在,它主要存放静态变量、全局变量和常量。

(1) 是因为静态存储区内的变量若不显示初始化,则编译器会自动以默认的方式进行初始化,即静态存储区内不存在未初始化的变量。
(2)静态存储区内的常量分为常变量和字符串常量,一经初始化,不可修改。静态存储内的常变量是全局变量,与局部常变量不同,区别在于局部常变量存放于栈,实际可间接通过指针或者引用进行修改,而全局常变量存放于静态常量区则不可以间接修改。   
(3)字符串常量存储在全局/静态存储区的常量区,字符串常量的名称即为它本身,属于常变量。   
(4)数据区的具体划分,有利于我们对于变量类型的理解。不同类型的变量存放的区域不同。



4.代码区:

存放程序体的二进制代码。比如我们写的函数,都是在代码区的。



总结:

在理解C/C++内存分区时,常会碰到如下术语:数据区,堆,栈,静态存储区,静态区,常量区,常变量区,全局区,字符串常量区,静态常量区,静态变量区,文字常量区,代码区等等;

数据区包括:堆,栈,全局/静态存储区;
全 局/ 静态存储区包括:常量区(静态常量区),全局区(全局变量区)和静态变量区(静态区)。 常量区包括:字符串常量区和常变量区;    
代码区:存放程序编译后的二进制代码,不可寻址区。

可以说,C/C++内存分区其实只有两个,即代码区和数据区。