当我这样做时:
vector<double> myVect(120000000, 0);
我可以让矢量看起来像我想要的那么多元素。但是,当我这样做时:
double myArray[120000];
在我的程序崩溃之前,我被限制在大约120000-130000个元素的某个位置。有什么东西搞砸了或阵列真的有限吗?
答案 0 :(得分:6)
数组本身不限于任何固定大小,但您在自动存储中分配的数组(通常称为&#34;堆栈&#34;)仅限于堆栈的大小。在静态存储中分配大型数组时,可以制作更大的数组。动态分配也是如此:无论您在不触发内存溢出的情况下分配的向量大小,都可以使用new
运算符创建相同大小的数组。
例如,您可以在不触发堆栈溢出的情况下执行此操作:
static double myArray[120000000]; // static memory area
或者这个:
double *myArray = new double[120000000]; // dynamic memory area
答案 1 :(得分:0)
vector在堆上分配内存,而示例中的myArray在堆栈上分配内存,这可能导致堆栈溢出。
堆栈主要用于存储函数参数,返回值等,不应存储大量数据。这就是为什么它通常具有OS指定的有限大小。
另一方面,堆是完全不同的。它可以根据其用途“增长”。如果堆耗尽所有内存,它可能会使用磁盘上的交换空间。所以它可能比堆栈大得多。
答案 2 :(得分:0)
在myArray
中,您试图在堆栈上分配120000
(从而导致崩溃),而在myVect
上,您在堆上执行此操作。
答案 3 :(得分:0)
程序可以使用的堆栈空间量有限。如果在堆上分配数组(使用new
运算符),一切都应该没问题。 std::vector
还在堆上分配对象。
答案 4 :(得分:0)
数组和std::vector
在C ++中有所不同。 'Array'是静态分配的,这意味着它从堆栈中获取内存。但是std::vector
是动态分配的,这意味着它从所谓的“免费存储”或“堆”中获取内存。
这就是为什么你可以有一个大的矢量但是有一个极限大小的数组。
答案 5 :(得分:0)
在几乎所有现代C ++编译器中,每个双字节长度为8个字节。它们的数组将消耗:
120000 * 8 = 960,000
130000 * 8 = 1,040,000
这意味着程序中每个堆栈帧的大小大约为1 MB。由于数组(以及所有其他“自动变量”)存储在堆栈中,因此每个函数限制为1 MB。向量和其他对象使用堆内存,它允许你有几GB的空间。
如果您需要增加堆栈大小,请查看此主题: Change stack size for a C++ application in Linux during compilation with GNU compiler