为什么你会想要在堆上有一个数组?
为什么你会想要在堆上有一个数组? 我的教授给了我们两个理由:
不能这些,而是通过解决:
有人能给我一个例子,说明堆中的数组必须被使用吗?
堆中的数组用于超出函数的范围。 将指针传递给堆栈上的数组仅适用于以后在上一个(上层)调用方中不想使用它的情况。 你不能从一个函数返回一个数组,你可以返回一个指向数组的指针,但是如果它被分配到堆栈中,它将在函数返回后指向一个无效的内存位置。
第一个原因是错误的:数组永远不会被复制传递。 当你调用一个函数时,数组名总是衰减成一个指向它的第一个元素的指针,恰恰是为了避免复制整个数组。 如果你想通过拷贝来传递一个数组,你必须将它嵌入到一个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