C/C++堆和栈的区别

(1) 生命周期不同
堆:一般由程序员分配释放,若程序员不释放,程序结束时可能由 OS 回收 。
栈:由编译器(Compiler)自动分配释放,存放函数的参数值、局部变量的值等。其操
作方式类似于数据结构中的栈。
(2)申请方式不同
堆: 程序中要分配一个堆空间可以使用 new(new 这是 C++中专用的关键字) 关键字、
malloc 函数, calloc()函数, realloc 函数实现,当不再需要这个堆空间时,可以使用 delete
(delete 这是 C++中专用的关键字) 关键字、 free 函数完成释放工作。
申请空间:
char p; //先定义一个字符类型指针,用来
p = (char
) malloc(100); //分配 1 块堆空间, 大小是 100 字节
p = (char*) calloc(50,2); //分配 2 块堆空间, 每块空间大小是 50 字节
p = (char*) realloc(p,10); //把 p 指向的堆空间重新调整为 10 字节
释放空间:
free§;
156
delete p;
栈:由系统自动分配。只要是局部变量 ,操作系统自动在栈中其开辟空间。
比如在 main 函数中定义一个变量 int b,则 b 使用的空间就是栈空间。
(3)底层实现机制不同
堆: 堆的生长方向是向上生长,一般是通过链表进行存储空间管理,内存上可以是不
连续的。
栈:栈的生长方向是向下生长(有的系统可能是向上生长), 且在使用上, 空间是连续
的。
(4)申请空间大小上限不同
堆:堆的大小受限于计算机系统中有效的虚拟内存。在 32 位系统上,其大小可以达
4G,使用起来比较灵活。
栈:在 Windows 下,栈的大小是固定的(是一个编译时就确定的常数),所以程序员不
适合在函数内申请过多的栈空间,否则可能会导致程序栈溢出。
(5)内存利用率不同
堆:堆空间的申请分配一般是随机的,不连续的内存空间, 容易产生内存碎片。
栈:由系统自动分配,速度较快,但程序员是无法控制的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值