• 个性签名
  • 格言大全
  • 名言大全
  • 笑话大全
  • 知识问答
  • 生活家居
  • 星座运势
  • 宝宝起名
  • 休闲爱好
  • 百科大全
  • 内存为什么要分堆栈在编程里,要是全部只用堆或者全部只用栈,可行吗

    栏目: 知识 日期:2023-10-01 10:02:00 浏览量(来源:小蒋

    [摘要]内存为什么要分堆栈在编程里,要是全部只用堆或者全部只用栈,可行吗?内存分为堆和栈主要是为了满足不同的需求和解决不同的问题。堆(Heap)主要用于动态分配内存,它...

    内存为什么要分堆栈在编程里,要是全部只用堆或者全部只用栈,可行吗?

    内存分为堆和栈主要是为了满足不同的需求和解决不同的问题。

    堆(Heap)主要用于动态分配内存,它的大小在程序运行时可以确定,允许动态添加和删除数据。堆的使用需要手动进行内存分配和释放,可通过函数如malloc()和free()来实现。由于堆的大小是可变的,因此堆上的内存可以在程序执行期间动态增长和收缩。

    栈(Stack)主要用于存储函数的局部变量和参数等,它的分配和释放是由编译器自动管理的,一般遵循后进先出的原则。栈上的内存分配和释放是自动的,无需手动干预。由于栈的管理机制简单高效,因此对于函数调用和返回等操作,使用栈可以提高程序的运行效率。

    如果全部只使用堆,可能会导致内存泄漏和碎片化的问题,因为需要手动分配和释放内存。而全部只使用栈,则会受限于栈的大小和生命周期的限制,无法实现动态分配和释放内存的需求。

    因此,为了兼顾灵活性和效率,内存分为堆和栈,在编程中根据实际需求进行选择和使用。

    内存为什么要分堆栈在编程里,要是全部只用堆或者全部只用栈,可行吗?

    其实我们都知道,计算机内存本来就是一块内存,没有堆栈之分。

    在学编程的时候,我们应该都听过一句话 “如果程序结束之后仍然想要访问那一段数据就要用堆”,我想这个其实就是你疑问的关键了,堆和栈都有其自己的独特性,可能你了解这两个东西,但是我还是解释下,以免别的小伙伴在看答案的时候,不知道。

    栈:就像我第一句话说的,本没有什么堆栈之分,但是编程语言的出现,就有了一个概念“函数”,这个函数之间是可以相互调用的(就像我们传递东西,比如:胡小然 将东西传递 胡小然2 将东西传递 胡小然3,之后需要从后面向前面反馈传递结果,这个传递的过程我们就可以理解为调用),那就出现了前后之分,这就是调用队列了,那这个队列有个什么特点呢,那就是先被调用进入队列的要最后出去,就是我们常说的先进后出(FILO),那么这时栈就出现了,而且它还有一个特点那就是线程独有(所以可以存放我们的临时变量),生命周期是随线程的。当然我所说的是内存栈的意思,其实“栈”就是个数据结构,是一种限定仅在表尾进行插入和删除操作的线性表,这个特性不正好是符合我刚才说的FILO嘛。所以你可以这么理解c++或者java(jvm)中的内存栈的概念,就是编程语言的作者为了管理内存使用了“栈”这种数据结构(说的再细点就是现代CPU体系结构决定了栈是管理函数调用和局部变量的最佳数据结构。因为CPU已经提供了现成的指令)。

    堆:可算是一种特殊的数据结构,好像我们经常使用的二叉树。内存堆这个解释起来就更简单了,就是一块能自由分配的内存。它允许程序在运行时动态地申请某个大小的内存空间,比如:程序员向操作系统申请一块内存,当系统收到程序的申请时,会遍历一个记录空闲内存地址的链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。其特点就是分配的速度较慢,地址不连续,容易碎片化并且是由程序员申请,同时也必须由程序员负责销毁,否则导致内存泄露。像在java这种高级语言中,我们不比担心内存回收的问题,那是因为jvm已经在帮我们处理了。


    上面说了这么多,就是想说明一下内存栈和内存堆出现的意义和作用,所以答案就出来了,那就是不能“只用堆或者全部只用栈”那样我们程序的调用和数据的存储都会出现问题。

    好了,上面只是我自己一些理解,不对的地方还请大家指出,也希望对题主的疑问有帮助。

    上一页12下一页