美文网首页
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 内存分区模型

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