堆和栈的区别

来源:互联网 发布:知乎 法国亚马逊 编辑:程序博客网 时间:2024/06/13 23:30
问题一:栈和堆存储在哪?
他们都存储在电脑的 RAM(Random Access Memory) 中

问题二:栈和堆中都保存的是什么?
栈 --->编译器在需要的时候分配,在不需要的时候自动清除变量的存储区,通常是局部变量,函数参数等;
堆 --->由 new 分配的操作块,一个 new 对应一个 delete
自由存储区 --->由 malloc 分配的内存块
全局/静态存储区 --->全局变量和静态变量被分配到同一块内存中
常量存储区 --->这时一块比较特殊的存储区,存放常量,不能修改
举个例子:
void f() {      int *p = new int[5]; }
看到 new 说明分配了一块堆内存,那么指针 p 是什么?p 分配的是一块栈内存,这句意思是在栈内存中存放一个指向一块堆内容的指针 p. 程序先会确定在堆中分配内存的大小,然后调用 operator new 分配内存,让后返回这块内存的首地址,放入栈中.

问题三:栈和堆区别是什么?
1.管理方式不同:对于栈来说,是由编译器自动管理,无需我们手动控制;对于堆来说,释放工作由程序员控制,容易产生 memory leak.
2.空间大小不同:栈空间大小是1M,而在32位系统下,堆内存空间可以达到4G
3.产生碎片不同:对于堆来说,频繁的 new/delete 势必会造成内存空间的不连续,而从造成大量碎片,使程序效率降低;对栈来说,不会产生碎片问题,栈是先进后出的队列不可能有一个内存块从栈中间弹出,在他弹出之前,在他上面的栈内容已经弹出.
4.生长方式不同:对于堆来说,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来说,它的生长方向是向下的,是向着内存地址减少的方向增长.
5.分配方式不同:堆是动态分配,没有静态分配的堆;栈有2中分配方式:静态分配和动态分配,静态分配是编译器完成的,比如局部变量的分配;动态分配由 alloc 函数进行分配,由编译器进行释放.
6.分配效率不同:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈地址,压栈出栈都有专门的指令执行,这就决定栈的效率比较高;堆是 C/C++函数提供的,例如分配一块内存,库函数会按照一定的算法在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回.
0 0
原创粉丝点击