内存四区、堆和栈的区别

内存四区

一个c/c++程序所占用的系统内存共分为4个部分

1、栈区(也叫堆栈,stack):存放所有的局部变量,函数,由系统进行自动完成。栈的大小:在Linux中为8兆, 在windows中为2兆。

2、堆区(heap):由程序员自己管理的,在程序运行过程中进行动态分配的内存。你可以用malloc()系列函数进行动态的添加和释放。堆的大小并不是固定的,可以动态的扩张或者收缩。

3、数据区:数据区中分两个部分

              第一部分—未初始化的数据段(bss):存放全局和静态(全局静态、局部静态)的未初始化的变量

              第二部分—数据段(data) :存放程序中明确被初始化的全局变量和静态变量(包括全局静态变量和局部静态变量)

4、代码段(text):存放所有可执行代码(包括程序指令、常量字符串等)都加载到代码区。这块内存在程序运行期间不变。


栈和堆的区别

以下从6个方面来比较两者

1、增长方向:栈:从上往下
                     堆:从下往上

2、管理方式:栈:编译器自动管理,无需程序员控制
                     堆:堆空间的申请和释放工作由程序员控制,但容易出现内存泄漏。

3、是否产生碎片:栈由系统操作控制不产生碎片
                           堆:由于频繁的malloc/free,造成内存空间的不连续,造成大量的碎片空间,程序效率低。

4、分配方式:栈:由编译器完成分配释放,栈的动态分配由alloca()函数完成,由编译器申请和释放。
                     堆:利用malloc()系列函数动态申请分配,由free()函数释放。

5、空间大小: 栈:很小。
                      堆:比栈要大的多。

6、分配效率:栈:很高:计算机会在底层对栈提供支持,分配专门的寄存器存放栈的地址。压栈、出栈都有专门的指令执行。
                     堆:比栈低的多:为了分配一块内存,库函数会按算法在堆内搜索可用的足够大的空间,没有的情况下需要操作系统来重新整理内存空间。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值