为什么你会想要在堆上有一个数组?

为什么你会想要在堆上有一个数组? 我的教授给了我们两个理由:

  • 将数组传递给函数,而不是传递副本
  • 这样数组就超出了范围
  • 不能这些,而是​​通过解决:

  • 将指针传递给堆栈上的数组
  • 返回数组的值而不是数组本身(即使用复制构造函数)
  • 有人能给我一个例子,说明堆中的数组必须被使用吗?


    堆中的数组用于超出函数的范围。 将指针传递给堆栈上的数组仅适用于以后在上一个(上层)调用方中不想使用它的情况。 你不能从一个函数返回一个数组,你可以返回一个指向数组的指针,但是如果它被分配到堆栈中,它将在函数返回后指向一个无效的内存位置。

    第一个原因是错误的:数组永远不会被复制传递。 当你调用一个函数时,数组名总是衰减成一个指向它的第一个元素的指针,恰恰是为了避免复制整个数组。 如果你想通过拷贝来传递一个数组,你必须将它嵌入到一个struct然后传递一个struct

    如果你事先不知道数组的大小,动态数组分配也是有用的(尽管在C99引入了可变长度数组后,这种情况并不是这样 - 但仍然可变长度的数组在堆栈上被分配,所以你会有相同的问题)。

    使用堆分配的另一个好理由是,对于非常大的数组,您可以轻松地从堆栈内存中移出。 堆一般较大。


    C中的数组表示为引用数组数据位置的指针(它指向数组中的第一项)。 在基于堆栈的数组中,数组指针和数据位于相同的位置。 在堆分配数组的情况下,数组指针位于堆栈上并指向数组数据开始的堆上的位置。

    对于点(2),您不能返回数组的值。 取而代之的是数组在内存或堆栈中的位置。 因此,在堆上分配它可确保从函数返回数组时保留数据。

    另一方面, std::vector在功能上与数组类似。 有了这个,数组数据被分配在堆上,但管理数组的对象在堆栈上。 因此,数组的生命周期由矢量对象的生存期控制。

    std::vector具有你描述的行为:

  • 将值传递给函数会导致数据在传递给函数时被复制;

  • 矢量数据仅在该函数的整个生命周期内存在。

  • 从函数传递矢量可能会导致数组数据被复制。 但是,这可以使用返回值优化和R值引用等优化来避免副本。


    如果此代码运行时不会崩溃,则可以将所有阵列分配到堆栈中。

    #include <string.h>
    int main() {
        volatile char buf[1024 * 1024 * 64];
        memset(buf, 0, sizeof(buf));
    }
    
    链接地址: http://www.djcxy.com/p/79841.html

    上一篇: Why would you ever want to have an array on the heap?

    下一篇: Where in memory are string literals ? stack / heap?