一直没搞清楚的堆与栈的总结
2016-09-13 22:06
211 查看
从数据结构上说
栈,是在内存中从高地址向低地址生长,并且是一块连续内存的区域。也就是说,在系统中,栈的栈顶地址,以及栈的大小,是事先就在编译器里设定好了的,这也就是为什么函数存在栈溢出的问题。
堆,是从低地址开始生长,并且是在内存中不连续的内存区域。操作系统采用链表形式来存储空闲内存地址的,也就是说,我们malloc或者callloc出来的内存,就是堆。可见,堆更加灵活。
从存储内容上说
主调函数调用新函数时,首先进栈的是主调函数的下一条指令的地址,然后是函数的各个参数,大多数编译器参数是从右往左入栈,接着是函数的局部变量,注意,静态变量不入栈。
堆存储的内容完全是由申请内存的程序员自行制定。
总结
总结: 栈是操作系统使用的一种功能,它有大小限制,操作不灵活。而堆是编程语言提供的一种功能,非常灵活,但是效率不如栈。最后,栈是操作系统自动释放的,而堆用完后最好主动调用free()来释放,虽然程序结束它也会自动释放。
为什么递归容易导致栈溢出?
根据以上的解释,当进行递归时,每一层递归的函数以及相应的局部变量都会被压入栈中,所以,递归过程就是一个只进不出栈的过程,自然存在栈溢出的可能性。改进方式就是使用循环语句来改进递归,或者自己申请栈空间、堆空间等。
栈,是在内存中从高地址向低地址生长,并且是一块连续内存的区域。也就是说,在系统中,栈的栈顶地址,以及栈的大小,是事先就在编译器里设定好了的,这也就是为什么函数存在栈溢出的问题。
堆,是从低地址开始生长,并且是在内存中不连续的内存区域。操作系统采用链表形式来存储空闲内存地址的,也就是说,我们malloc或者callloc出来的内存,就是堆。可见,堆更加灵活。
从存储内容上说
主调函数调用新函数时,首先进栈的是主调函数的下一条指令的地址,然后是函数的各个参数,大多数编译器参数是从右往左入栈,接着是函数的局部变量,注意,静态变量不入栈。
堆存储的内容完全是由申请内存的程序员自行制定。
总结
总结: 栈是操作系统使用的一种功能,它有大小限制,操作不灵活。而堆是编程语言提供的一种功能,非常灵活,但是效率不如栈。最后,栈是操作系统自动释放的,而堆用完后最好主动调用free()来释放,虽然程序结束它也会自动释放。
为什么递归容易导致栈溢出?
根据以上的解释,当进行递归时,每一层递归的函数以及相应的局部变量都会被压入栈中,所以,递归过程就是一个只进不出栈的过程,自然存在栈溢出的可能性。改进方式就是使用循环语句来改进递归,或者自己申请栈空间、堆空间等。
相关文章推荐
- 一直没搞清楚的堆与栈的总结
- 一直没搞清楚的堆与栈的总结
- 一直没搞清楚的堆与栈的总结
- 一直没搞清楚的堆与栈的总结
- 一直没搞清楚的堆与栈的总结
- 一直没搞清楚的堆与栈的总结
- 一直没搞清楚的堆与栈的总结
- 一直没搞清楚的堆与栈的总结
- 一直没搞清楚的堆与栈的总结
- 一直没搞清楚的堆与栈的总结
- 一直没搞清楚的堆与栈的总结
- 一直没搞清楚的堆与栈的总结
- 一直没搞清楚的堆与栈的总结
- 一直没搞清楚的堆与栈的总结
- 一直没搞清楚的堆与栈的总结
- 一直没搞清楚的堆与栈的总结
- 一直没搞清楚的堆与栈的总结
- 一直没搞清楚的堆与栈的总结
- matlab的小知识点总结(一直补充)
- "select一直返回0"的问题解决和总结