为什么你会想要在堆上分配内存而不是堆栈?

可能重复:
什么时候最好使用栈而不是堆,反之亦然?

我已经阅读了关于堆vs堆的其他一些问题,但他们似乎更关注堆/堆的作用,而不是为什么要使用它们。

在我看来,堆栈分配几乎总是首选,因为它更快(只需移动堆栈指针与在堆中寻找空闲空间),并且在完成使用时不必手动释放分配的内存。 我可以看到使用堆分配的唯一原因是如果你想在一个函数中创建一个对象,然后在该函数范围外使用它,因为从函数返回后,堆栈分配的内存会自动未分配。

是否有其他原因使用堆分配,而不是堆栈分配,我不知道?


有几个原因:

  • 主要的一点是,通过堆分配,您可以最灵活地控制对象的生命周期(从malloc / callocfree );
  • 堆空间通常是比堆空间更有限的资源,至少在缺省配置中是这样;
  • 分配堆空间失败可以优雅地处理,而堆空间用完通常是不可恢复的。
  • 没有灵活的对象生命周期,有用的数据结构(如二叉树和链表)实际上不可能写出来。


  • 您希望分配超出函数调用的范围
  • 您希望节省堆栈空间(通常仅限于几MB)
  • 你正在使用可重定位的内存(Win16,数据库等),或者想从分配失败中恢复。
  • 变长的任何东西。 你可以伪装这个,但是你的代码会很糟糕。
  • 最大的是#1。 只要你进入任何类型的并发或IPC#1无处不在。 即使大多数非平凡的单线程应用程序也很难在没有一些堆分配的情况下进行设计。 这实际上是在C / C ++中伪造一种功能语言。


    所以我想制作一个字符串。 我可以把它放在堆上或堆上。 我们来试试两个:

    char *heap = malloc(14);
    if(heap == NULL)
      {
        // bad things happened!
      }
    strcat(heap, "Hello, world!");
    

    对于堆栈:

    char stack[] = "Hello, world!";
    

    所以现在我在他们各自的地方有这两个字符串。 后来,我想让他们变长一点:

    char *tmp = realloc(heap, 20);
    if(tmp == NULL)
      {
        // bad things happened!
      }
    heap = tmp;
    memmove(heap + 13, heap + 7);
    memcpy(heap + 7, "cruel ", 6);
    

    对于堆栈:

    // umm... What?
    

    这只是一个好处,其他人也提到了其他好处,但这是一个相当不错的选择。 随着堆,我们至少可以尝试使我们分配的空间更大。 随着堆栈,我们坚持我们拥有的。 如果我们想要增长空间,我们必须首先宣布这一点,我们都知道它看起来很臭,

    char username[MAX_BUF_SIZE];
    
    链接地址: http://www.djcxy.com/p/14007.html

    上一篇: Why would you ever want to allocate memory on the heap rather than the stack?

    下一篇: Why is there a stack and a heap?