栈和堆的区别

栈的特性:先进后出,主要为一个线程独享,为这个线程的函数的调用服务的。用于存放返回地址,零时变量个参数而用。栈的内存一般都是由编译器自己来分配释放的,编译器所分配的内存是连续的,当定义一个变量的时候,在当前栈区的尾部来分配心的变量的内存。在windows系统里面栈的大小是2M,在linux系统里面栈的大小是8M,可以使用ulimit-s来设置栈的大小。栈的空间的分配是由高地址向低地址分配的。

堆的分配和释放是由程序员来分配和释放。在windows系统里面一般是小于2G的。因为系统是用链表来实现空闲地址空间的,所以堆的内存空间不是连续的,链表的遍历也是由低地址到高地址的,所以分配内存也是又低地址向高地址分配。

申请后系统的响应

栈:只要栈的剩余空间大于所申请的空间,系统将为程序提供内存,否则将报异常提示栈溢出。

堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该节点从空闲结点链表中删除,并将该结点的空间分配给程序。对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动地将对于的那部分重新放入空闲的链表中。

栈和堆中存储的内容

栈:在函数调用时,第一个进栈的是主函数中的下一条指令的地址,然后是函数的各个参数,在大多数C编译器中,参数是由右向左入栈的,然后是函数中的局部变量,注意静态变量是不入栈的,静态变量存储在静态存储区。当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。

堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容由程序员安排。

 

申请效率

栈:由系统自己分配,速度较快,但是程序员无法掌握。

堆:一般有两种方法来申请内存,new、和malloc,new是一种用算符而malloc是函数。由程序员申请出来的内存一般速度比较慢,而却容易产生内存碎片,不过用起来比较方便。

特点

堆的大小取决于操作系统有效的虚拟内存的大小,堆获得空间比较灵活,也相对而言比较大,但是速度慢;栈的话分配内存就相对快很多了。

你可能感兴趣的:(C++)