c++内存分配方式

在c++中,内存分为5个区,它们分别是堆,栈,自由存储区,全局/静态和常量存储区


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

注:编译期限制栈大小和系统限制栈深度不同,编译限制栈深度是限制单个函数栈帧的大小,而系统限制栈深是限制进程主线程的栈深,限制的是整个函数调用链的最大栈深,这个栈深是函数调用链上各个函数栈帧大小之和。

堆:就是由new分配的内存块,他们释放由程序员去控制,一般一个new就要对应一个delete。如果程序员没有释放,那么在程序结束后,操作系统会自动回收。

自由存储区:就是那些由malloc等分配的内存块,他和堆十分相似,不过它是用free来结束生命的。

全局/静态存储区:全局变量和静态变量被分配到同一块内存中(和c语言不同)

常量存储区:这是一块比较特殊的存储区域,这里方的是常量,不允许被修改

堆与栈的区别:

  1.空间大小不同

  2.能否产生碎片不同

  3.生长方向不同

  4.分配方式不同

  5.分配效率不同

  6.管理方式不同

空间大小:一般来讲在32位系统下,堆内存可以达到4G的空间,从这个角度来讲堆内存几乎是没有限制的。但对于栈来说一般是有限制的,Windows上一般默认的栈大小为1024K,Linux为10240K,栈的大小可以被修改。

碎片问题:对于堆来讲,频繁的new/delete会导致内存空间的不连续,从而造成大量的碎片,使程序效率降低。而,栈是先进后出的队列,则不存在这个问题。

生长方向:对于堆来说,生长方向是向上的也是向着内存地址增长的方向;对于栈来说,他的生长方向是向下的,向着内存地址减小的方向增长

分配方式:堆是动态分配的,没有静态分配的堆。而栈有两种分配方式:静态分配和动态分配。静态分配时由编译器完成的,比如

分配效率:堆是c/c++函数库提供的,他的机制很复杂,例如为了分配一块内存,库函数会按照一定的算法(具体算法可以参考数据结构/操作系统)在堆内存中搜索可用的足够大小的空间。如果没有足够大的空间(可能由于内存碎片太多),就可能调用系统功能去增加程序数据段的内存空间,这样就有机会分得足够大的内存,然后返回。而栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。

管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生内存碎片

     无论是堆还是栈都要防止越界的现象发生,以为越界的结果要么是程序崩溃要么是摧毁程序的堆结构和栈结构产生意想不到的结果。


文章仅用来复习整理知识点,如有雷同,算我copy他的(就是整理知识点,大家看看就好)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值