堆栈的认知

1、堆(Heap)和栈(Stack)是两种不同的数据结构

        堆(Heap):

  • 堆是一种特殊的树形数据结构,通常用于实现优先队列等数据结构。
  • 堆可以分为最大堆和最小堆,最大堆中父节点的值大于等于子节点的值,最小堆中父节点的值小于等于子节点的值。
  • 堆的主要操作包括插入和删除,其中删除操作通常是删除堆顶元素并重新调整堆的结构。
  • 堆常用于实现堆排序、Dijkstra算法、Prim算法等。
  • 堆是动态分配内存的一种方式,用于存储程序运行时需要动态分配的数据。
  • 在堆上分配的内存由程序员显式管理,需要手动分配和释放内存,否则可能导致内存泄漏。
  • 堆上的内存分配通常比较灵活,可以根据需要动态调整大小,但也容易产生内存碎片问题。
  • 堆常用于存储动态数据结构,如链表、树等,以及需要在程序运行时动态分配内存的情况。

  • 栈(Stack):
  • 栈是一种后进先出(LIFO)的数据结构,用于存储函数调用时的局部变量、函数参数和返回地址。
  • 栈上的内存分配和释放由编译器自动管理,函数调用时会将局部变量压栈,函数返回时自动弹栈释放内存。
  • 栈上的内存分配速度比较快,因为只需移动栈指针即可完成分配,但存储空间有限。
  • 栈常用于存储临时数据、函数调用信息和递归调用时的调用栈。

2、定义变量是在堆还是栈上?

变量的存储位置可以在堆(Heap)或者栈(Stack)上,具体取决于变量的类型、分配方式、生命周期。

  1. 栈(Stack)上的变量:
  • 栈用于存储局部变量和函数参数,以及函数调用时需要保存的上下文信息。
  • 当函数被调用时,函数的参数和局部变量将被分配到栈上,并在函数执行结束后自动释放。
  • 栈上的变量具有较短的生命周期,随着函数的执行而动态分配和释放。
  1. 堆(Heap)上的变量:
  • 堆用于动态内存分配,通常通过 new 或 malloc 等函数在堆上分配内存。
  • 堆上的变量的生命周期由程序员显式管理,需要手动释放分配的内存以避免内存泄漏。
  • 在堆上分配的变量可以在不同函数之间共享,并且其生命周期可以超出单个函数的范围。

3、函数存储在代码段上

        函数的定义通常是存放在代码段(Code Segment)或者文本段(Text Segment)中,而不是存放在堆(Heap)或者栈(Stack)上。这些代码段通常是只读的,存放着程序的指令代码,包括函数的定义和实现。

        当程序被加载到内存中时,函数的定义会被加载到代码段中,供程序执行时调用和执行。函数的定义通常被视为静态数据,不会被放在动态分配的堆上或者栈上。每次函数调用时,程序会跳转到代码段中相应函数的地址位置,执行函数的指令代码。

        因此,函数的定义通常存放在代码段中,而不是堆或者栈上。这种存储方式使得函数可以在程序执行过程中被重复调用,而不需要在堆或栈上重新分配存储空间。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值