C/C++的内存管理

内存分配方式

我们经常看到“程序是在内存中运行的”这句话就会想当然认为内存就是内存,程序都是一股脑的放在内存中让操作系统来运行,但是又经常看到堆栈,静态存储区等等名词,所以常常混淆这些概念,下面,通过阅读大量技术博客,自己总结出来内存的分配,总结如下:

         在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区、常量存储区
  :在执行函数时,函数内局部变量的存储单元都可以在栈上创建,栈中主要存放一些基本类型的变量(int, short, long, byte, float, double, boolean, char,指针)函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。也就是说我们经常定义的常量都是存储在栈中的,栈的速度比堆快,栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。在栈上分配的内存系统会自动地为其释放,例如在函数结束时,局部变量将不复存在,就是系统自动清除栈内存的结果。但堆中分配的内存则不然,堆大小的分配其实是由malloc,free来操作的,这里面涉及一系列的算法,一切由你负责,即使你退出了new表达式的所处的函数或者作用域,那块内存还处于被使用状态而不能再利用。比如定义int a[10],定义一个数组大小为10的数组,这个数组的大小是在堆中分配的。而int *p.这个指针是存在栈中的。
  :就是那些由 new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个 delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
  自由存储区:就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
  全局/静态存储区:全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。static关键字修饰的变量就存储在这个静态存储区,静态存储区只初始化一次。
  常量存储区:这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。一般是只读特性,也就是经常用const来修饰,让其变为只读特性。

为什么要设计出堆栈这种结构?

因为栈是指向堆的,指针在栈中,数据在堆中

设计原因有两点:

⑴栈的存取速度特别快,仅次于寄存器。当程序要在内存中读写数据时,先找到栈,再通过栈的指向到堆内存中进行数据的读写。由于不用再遍历速度慢而且数据多的堆内存,所以程序的运行速度会更快。
⑵便于内存的回收。当程序的一些数据不用后,就会丢掉栈内存中相应的数据,此时以前指向的堆内存空间就没有了栈的指向,变成了垃圾。这时Java虚拟机的垃圾回收机制就会将这块没有栈指向的堆内存空间回收,供给以后的程序使用。

这句话的意思就是说,内存回收时,只需要将栈的数据就可以了
堆栈的用途主要是调用子程序时暂存断点地址和保护(恢复)现场数据。堆栈是一种存储部件,即数据的写入跟读出不需要提供地址,而是根据写入的顺序决定读出的顺序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值