标签: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