C++内存管理图解

链接知识
内存管理 https://blog.csdn.net/ZLK961543260/article/details/77971236

内存图解

图一
C++内存管理图解_第1张图片

图二
C++内存管理图解_第2张图片

  • 代码区:存放CPU执行的机器指令,代码区是可共享,并且是只读的。

  • 数据区:存放已初始化的全局变量,静态变量(全局和局部),常量数据。

  • BBS区:存放的是未初始化的全局变量和静态变量。 -

  • 栈:。内存由编译器在需要时自动分配和释放通常用来存储局部变量和函数参数(为运行函数而分配的局部变量,函数参数,返回地址等存放在栈区)栈运算分配内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

  • 堆:内存使用新进行分配,使用删除或删除[]释放如果未能对内存进行正确的释放,会造成内存泄漏但在程序结束时,会由操作系统自动回收。

  • 自由存储区:使用的malloc进行分配,使用免费进行回收和堆类似。

  • 全局/静态存储区:全局变量和静态变量被分配到同一块内存中,C语言中区分初始化和未初始化的,C ++中不再区分了(全局变量,静态数据,常量存放在全局数据区) )

  • 常量存储区:存储常量,不允许被修改。

里,在一些资料中是这样定义的C ++内存分配的,可编程内存在基本上分为这样的几大部分:静态存储区,堆区和栈区他们的功能不同,对他们使用方式也就不同。

  1. 静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在它主要存放静态数据,全局数据和常量。

  2. 栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

  3. 堆区:亦称动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存。动态内存的生存期可以由我们决定,如果我们不释放内存,程序将在最后才释放掉动。

栈和堆的区别

管理方式
栈是由编译器进行管理,无需我们手动控制.
堆的释放工作由程序员进行管理,容易产生内存泄露.

申请大小

栈是向低地址扩展的数据结构,是一块连续的内存区域,能从栈获得的空间较小 ,编译时就确定了大小.
堆是向高地址扩展的数据结构,是不连续的内存区域,堆获得的空间比较灵活,也比较大.

碎片问题:
栈是先进后出的队列,不会有内存块从栈中间弹出.
对于堆来讲,频繁的new/delete势必会造成内存空间的不连续性,从而造成大量的碎片 ,使程序效率降低.

分配方式:
栈有2种分配方式: 静态分配和动态分配.
堆都是动态分配.

分配效率:
栈是机器系统提供的数据结构,会在底层对栈提供支持.
堆则是c/c++函数提供的,它的机制比较复杂. 存

你可能感兴趣的:(C++)