四大内存分区

内存分区

内存分为四个区域:堆、栈、全局/静态存储区、只读区(常量区和代码区)。
四大内存分区_第1张图片

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

特点:
读取速度快,存储和释放的思路是按照数据结构中的栈进行的,存数据就是压栈,释放就是弹栈。

空间小,基本类型的数据占用空间的大小不会随着值的改变而改变,而且占用空间小。

2、堆
由编程人员手动申请,手动释放,若不手动释放,程序结束后由系统回收,生命周期是整个程序运行期间。使用malloc或者new进行堆的申请,堆的总大小为机器的虚拟内存的大小。

特点:
读取速度慢。

空间大:引用类型的数据大小是动态的,会随着数据的增加而改变大小。

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

3、全局/静态存储区:
全局/静态存储区内的变量在程序编译阶段已经分配好内存空间并初始化,它主要存放静态变量和全局变量。
特点:在程序整个运行期间数据会一直在这块内存中。

#全局变量一般会使用extern关键字来声明,比如:
extern int m_nClientId;

#而静态变量则是使用static关键字来声明:
static int nCount;

全局变量和静态变量的区别在于:全局变量的作用域更广,整个模块中都能使用;静态变量则因其定义的位置不同有不同的作用域。

可以在函数中定义静态变量,也可以在类中定义静态成员变量。函数中定义的静态变量只能在函数中被访问,类中定义的静态变量则可以在类外部使用“类名::静态成员变量名”去访问。

4.1、文字常量区
该分区是用来存放常量值,如常量字符串等,比如如下的字符串常量(将字符串常量的地址赋值给指针p):

char* p = ”this is a test.”;

该字符串占用的内存地址就是文字常量区内存上的。该部分内存中的内容是固定的常量,是不允许修改的,程序结束后由操作系统统一回收。

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

https://blog.csdn.net/niannianxi/article/details/107599705?

你可能感兴趣的:(C++,java,c++,开发语言)