美文网首页
9 内存分区模型

9 内存分区模型

作者: ca8519be679b | 来源:发表于2020-10-20 00:03 被阅读0次

c++程序执行时,有如下图的4个区域

代码区,存放函数体的二进制代码,由操作系统管理

全局区,存放全局变量和静态变量、常量(大部分)

栈区,编译器自动分配释放,存放函数的参数及局部变量

堆区,程序员分配和释放,若程序员不释放,则程序结束操作系统回收

1

不同的区域,关联不同的生命周期

程序运行前

程序编译后生成可执行exe程序,未双击或ide点运行前,分为2个区域(即未点击运行但是经过编译就已经在内存中有了):

代码区:存放cpu执行的机器指令(函数代码被翻译成二进制指令),代码区是共享的,因为对于频繁访问的方法,只要一个区域即可,代码区又是只读的,防止程序意外修改了内容(即执行指令)

常量区:存放全局变量,静态变量,和常量的部分

2

如上,我们展示了局部变量和全局静态变量,可以看到局部的是1992开头(为了展示地址我们都int转换了),而全局和静态可以看到是714开头的,这里我们没有细讲全局和静态,只是全局变量是定义在方法外的,静态是局部变量加上static关键字

3

为什么我们说常量区是部分常量呢,可以看如上,我们比如创建个字符串,那其就是个字符串常量,我们也可以局部变量加const修饰,可以看到结果const修饰的局部常量和局部变量是在一个区域,并不在常量区

4

当然还有const修饰的全局常量,也是在常量区的

程序运行时

点击运行后,程序会把参数和局部变量存到栈区,注意不要让函数返回地址,因为编译器可能会释放开辟的空间,因此不建议方法返回局部变量的地址

如果想将编译器不释放空间,需要使用堆区,方法为new

5

如上,我们可以new对象,这里定义方法和之前的不一样,是使用int(10),new这里就将10给堆空间,同时方法返回的就是指针,可以左侧int *接收,而且这部分不会被编译器自动释放的危险,仅由程序员控制或者程序结束操作系统释放

new方法

我们刚才讲了new方法可以讲内存堆空间开辟区域,但是这段释放需要程序员控制,释放的关键字对应的是delete

6

如上,我们定义了指针指向堆空间new出来的区域,但是我们delete释放掉后,p就无法解引用了。

7

同样,我们也可以在堆区开辟数组空间,如上,这里就使用new 数据类型[]即可,我们因为p指向了数组,所以p就和数组名一样,可以使用索引来访问元素,如果想delete删除,我们需要加[],因为是释放数组空间,如果不加则识别为释放一个元素的空间

最后说下堆区和栈区的意义,内存的栈区读写速度快,但是空间小,堆区空间大但是速度慢(new,delete),new将引用指向堆区防止变量存在栈区释放溢出,局部变量引用失效这样的情况出现

相关文章

  • 9 内存分区模型

    c++程序执行时,有如下图的4个区域 代码区,存放函数体的二进制代码,由操作系统管理 全局区,存放全局变量和静态变...

  • JVM基础知识点

    1. 内存模型以及分区,需要详细到每个区放什么(共分为5个)。 JVM内存模型及分区jvm内存模型和内存分配 程序...

  • 【JAVA面试之路】1.1 JVM 常见面试题

    1、内存模型以及分区,需要详细到每个区放什么? 1.1 什么是内存模型? 内存模型是为了保证共享内存的正确性(可见...

  • Java内存模型(JMM)

    Java内存模型(JMM) 我们常说的JVM内存模式指的是JVM的内存分区;而Java内存模式是一种虚拟机规范。 ...

  • JMM内存模型详解

    Java内存模型(JMM) 我们常说的JVM内存模式指的是JVM的内存分区;而Java内存模式是一种虚拟机规范。 ...

  • 架构筑基面试题系列:JVM+并发编程+Netty

    JVM 1. 内存模型以及分区,需要详细到每个区放什么? 2.堆里面的分区:Eden,survival (from...

  • 掌握JVM面试专题和答案Offer拿到手软(附学习路线图)

    1.内存模型以及分区,需要详细到每个区放什么。 2. 堆里面的分区:Eden,survival (from+ to...

  • Java内存模型以及分区

    Java内存模型以及分区 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这...

  • Java内存模型以及分区

    Java内存模型即Java Memory Model(JMM)。JVM是整个计算机虚拟模型,JMM定义了JVM在计...

  • C++内存分区模型

    内存分区模型 C++程序在执行时,将程序大方向划分为4个区域 代码区:存放函数体的二进制代码,由操作系统进行管理的...

网友评论

      本文标题:9 内存分区模型

      本文链接:https://www.haomeiwen.com/subject/blxqmktx.html