C/C++ 堆和栈的区别

C/C++ 堆和栈的区别

  1. 管理方式不同
    栈,由编译器自动管理,无需程序员手动控制;堆,产生和释放由程序员控制。

  2. 空间大小不同
    堆是不连续的内存区域(因为系统是用链表来存储空闲内存地址,自然不是连续的),堆大小受限于计算机系统中有效的虚拟内存(32bit 系统理论上是4G),所以堆的空间比较灵活,比较大。栈是一块连续的内存区域,大小是操作系统预定好的,windows下栈大小是2M(也有是1M,在编译时确定,VC中可设置)。

  3. 能否产生碎片不同
    栈不会产生碎片,因为栈是种先进后出的队列。堆则容易产生碎片,多次的new/delete 会造成内存的不连续,从而造成大量的碎片。

  4. 生长方向不同
    堆的生长方式是向上的,向高地址方向增长,栈是向下的,向低地址方向增长。

  5. 分配方式不同
    堆都是动态分配(没有静态分配的堆)。栈有静态分配和动态分配,静态分配由编译器完成(如局部变量分配),动态分配由alloca函数分配,但栈的动态分配的资源由编译器进行释放,无需程序员实现。

  6. 分配效率不同
    栈是机器系统提供的数据结构,计算机底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令。 堆则是由C/C++函数库提供,库函数会按照一定的算法在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。

  7. 堆和栈相比,由于大量new/delete的使用,容易造成大量的内存碎片;由于没有专门的系统支持,效率很低;由于可能引发用户态和核心态的切换,内存的申请,代价变得更加昂贵。所以栈在程序中是应用最广泛的,就算是函数的调用也利用栈去完成,函数调用过程中的参数,返回地址,局部变量都采用栈的方式存放。

  8. 栈和堆相比不是那么灵活,有时候分配大量的内存空间,还是用堆好一些。

  9. 无论是堆还是栈,都要防止越界现象的发生。


int a = 0;   //全局初始化区
char *p1;    //全局未初始化区
main()
{
int  b;                     //栈
char s[] = "abc";           // 栈
char *p2;                   //栈
char *p3  =  "123456";      // 123456 /0在常量区,p3在栈上。
static int c = 0// 全局(静态)初始化区
p1 = (char *)malloc(10)
p2 = (char *)malloc(20)    // 分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456");      /* 123456 /0放在常量区,编译器可能会将它
                          与p3所指向的"123456"优化成一个地方。*/

参考博客地址:https://blog.csdn.net/yangyong0717/article/details/78001609;
http://blog.chinaunix.net/uid-26868581-id-3328648.html;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值