码迷,mamicode.com
首页 > 编程语言 > 详细

c++ 堆和栈以及区别

时间:2018-09-25 22:57:28      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:c++   程序   管理   频繁   区别   出现   堆和栈   函数参数   har   

c++中内存分成5个区:堆、栈、自由存储区、全局\静态存储区、常量存储区

栈是一种连续存储的数据结构,具有先进后出的性质。堆是一种非连续的树形存储数据结构,每个节点有一个值,整棵树是经过排序的,特点是根节点的值最小(或最大),且根节点的两个子树也是一个堆。

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

堆和栈的区别:

(1)管理方式:堆中资源由程序员控制(通过malloc/free、new/delete,容易产生memory leak),如果程序员没有释放掉,资源将由操作系统在程序结束后自动回收。栈资源由编译器在需要时自动分配,不需要时自动清除的变量存储区,通常存放局部变量、函数参数等。
(2)系统响应:对于堆,系统有一个记录空闲内存地址的链表,当系统收到程序申请时,遍历该链表,寻找第一个大于所申请空间的空间的堆结点,删除空闲结点链表中的该结点,并将该结点空间分配给程序(大多数系统会在这块内存空间首地址记录本次分配的大小,这样delete才能正确释放本内存空间,另外,系统会将多余的部分重新放入空闲链表中)。对于栈,只要栈的剩余空间大于所申请空间,系统就会为程序分配内存,否则报异常出现栈空间溢出错误。
(3)空间大小:堆是不连续的内存区域(因为系统是用链表来存储空闲内存地址的,自然不是连续),堆的大小受限于计算机系统中有效的虚拟内存(32位机器上理论上是4G大小),所以堆的空间比较灵活,比较大。栈是一块连续的内存区域,大小是操作系统预定好的,windows下栈大小是2M(也有是1M,在编译时确定,VC中可设置)。
(4)碎片问题:对于堆,频繁的new/delete会造成大量内存碎片,降低程序效率。对于栈,它是一个先进后出(first-in-last-out)的结构,进出一一对应,不会产生碎片。
(5)分配效率:堆由C/C++函数库提供,机制很复杂,因此堆的效率比栈低很多。栈是机器系统提供的数据结构,计算机在底层对栈提供支持,分配专门的寄存器存放栈地址,提供栈操作专门的指令。
 
 
 
 
http://www.cnblogs.com/yiluyisha/p/9049051.html

c++ 堆和栈以及区别

标签:c++   程序   管理   频繁   区别   出现   堆和栈   函数参数   har   

原文地址:https://www.cnblogs.com/ymjyqsx/p/9703846.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!