提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
前言
在写程序代码的时候,我们可能往往都疏忽了堆和栈这两种数据结构。只是随便设置一下大小保证程序可以正常运行就行了。有的时候在找工作的时候面试官问你堆和栈一脸懵逼,今天在这里做一下简单的总结。
提示:以下是本篇文章正文内容,下面案例可供参考
一、定义
在单片机中,堆和栈是两种用于管理内存的数据结构。
1.栈(stack):
栈是一种后进先出(LIFO)的数据结构,它用于存储函数调用的局部变量、函数参数以及函数返回地址信息(地址信息:当一个函数被调用时,程序需要知道在函数执行完毕后继续执行的位置,因此,函数的返回地址会被压入栈中)等。栈的大小是固定的,由编译器在编译时确定。当一个函数被调用时,他的局部变量和参数会被分配到栈上,并在函数返回时自动释放。栈的操作非常高效,因为它只需要移动栈指针即可。
2.堆(Heap):
堆是一种动态分配的内存方式,它用于存储程序运行时动态创建的对象或数据。堆的大小是不固定的,可以根据需要进行动态扩展。在单片机中,堆的管理通常由操作系统或者编译器提供的库函数来完成。通过调用这些库函数,可以在堆上分配内存(例如使用malloc函数),并在不需要时释放内存(例如函数free函数)。由于堆的管理需要额外的开销,所以堆的操作相对较慢。
二、两者区别
1.分配方式:
(1)栈:由编译器自动分配和释放内存,存储局部变量和函数调用的上下文信息。栈的分配速度快,但大小有限。
(2)堆:由程序员手动分配和释放,存储动态分配的对象。堆的分配速度相对较慢,但是大小理论上没有限制。
2.内存管理:
(1)栈:由编译器自动管理,无需手动释放内存。当函数执行完毕或者变量超出作用域时,栈上的数据会自动被销毁。
(2)堆:由程序员手动管理,需要手动释放内存。如果不及时释放堆上的内存,会导致内存泄漏。
3.存储内容:
(1)栈:主要存储局部变量。函数参数、返回地址等。栈上的数据是按着先进后出的顺序进行存储和访问。
(2)堆:主要用于存储动态分配的对象,如使用new 关键字创建的对象。堆上的数据可以通过指针进行访问。
4.分配效率:
(1)栈:分配和释放速度快,进需要移动栈指即可完成
(2)堆:分配和释放速度相对较慢,需要在堆中搜索可用的内存块。
总结
知识在于积累,每天进步一点点!