堆和栈的区别

本文详细介绍了C/C++程序的内存布局,包括栈区、堆区、常量区、文字常量区和程序代码区的功能及使用特点,并对比了栈和堆的主要区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个由C/C++编译的程序所占内存分为以下几个部分:
1、栈区:由编译器或系统分配和释放的,如存放函数参数,或者局部变量等。
2、堆区:由程序员分配和释放,诺程序员不释放,程序结束时则由OS回收。
3.常量区(静态区):存放全局变量和静态变量的区域,初始化的全局变量和静态变量存放在一块区域,未初始化的全局量和静态变量存放在相邻的另一块区域。程序结束由系统自动释放。
4、文字常量区:存放常量字符串的区域,程序结束时由系统自动释放。
5、程序代码区:存放函数的二进制代码。
栈和堆的区别:
1、申请和释放的方式:
         栈是由系统自动分配和释放的。
         堆是由程序员自己分配和释放的。
2、栈和堆得大小不同:
         栈的空间小于堆的空间,大约为2MB。
         堆的空间大小为4G。
3、是否产生内存碎片:
         栈是先进先出的队列,不会产生内存碎片。
         堆则容易产生内存碎片,多次分配和释放不同大小的空间容易产生内存碎片。
4、生长方式不同:
         栈向下生长
         堆是向上生长
5、分配方式不同:
         栈既可以动态分配空间(调用alloca函数)还可以静态分配空间。
         堆只能动态分配空间
6、缓存区的级别不同:
         栈为一级缓存区(容量小,速度快,在CPU里)。
         堆为二级缓存区(容量大,速度慢,在CPU与内存的中间那块地址空间)。
7、栈和堆的分配效率不同
        栈是由机器系统提供的数据结构,计算机底层对栈提供支持,分配专门的寄存器存放栈的地址,压栈和出栈提供专门的指令。
        堆是由C/C++函数库提供的,库函数会按照一定的算法在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间
就有可能调用系统的功能去增加程序数据段的内存空间这样就有机会分配足够大小的空间,所堆的分配效率小于栈的分配效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值