面试集锦--堆与栈的区别

1、在申请方式上的不同:栈是系统自动分配的,使用完后系统自动删除。堆是手动分配,使用完后手动删除。

2、系统响应的不同:只要栈的剩余空间大于所申请的空间,系统就会为程序提供内存,否则系统提示栈溢出错误。

但是系统收到堆申请空间,系统会遍历用于记录空闲内存的链表,直到找到满足大小的内存空间,,当找到后,系统就从内存空闲链表中删除,将该段内存分配给堆,同时在该段内存中的首地址处标记堆的大小。如果这段内存没有被堆使用完,则剩余的空间再加到空闲链表中。

3、空间大小的不同:在windows下栈是一块连续的区域,大小事2M或其他。总之该数值在编译时就是一个确定的常数。加入申请的栈内存过大,就会导致栈溢出,不能指望栈能分配更多的内存。而堆是不连续的内存区域,堆的大小是由系统中虚拟内存来决定的。

4、执行效率的不同:栈是自动分配,效率快。堆是手动分配效率慢,而且容易产生内存碎片。

5、申请空间命名方式不同:栈是有名分配,可以用其名字来访问,堆是匿名分配,只能用指针访问。

6、函数调用方式不同:在栈中被调用函数的下一行先进栈,然后是从右往左参数进栈,然后是局部变量进栈。然后按照先进后出的原则依次出栈并处理数据。

在堆中内存区域不连续,因此在使用时必须由程序员来安排。

你可能感兴趣的:(windows,面试)