【问题标题】:Why a big size of array cannot be generated while a vector can?为什么不能生成大尺寸的数组而向量可以?
【发布时间】:2021-02-13 20:03:24
【问题描述】:

我有以下代码:

#include <random>
#include <vector>
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
const int N=100000;
int main() {

    default_random_engine Generator(time(0));
    uniform_real_distribution<float> dist(0.0f,nextafter(1.0f, DBL_MAX));

    array<float,N> a{0};
    //vector<float> a(N,0);



    for ( auto it = a.begin(); it != a.end(); ++it ){
        *it=dist(Generator);
    }

    return 0;
}

我的歧义是当N为100000时可以生成数组a,但是当N变为100万时,它立即退出程序,退出值不为零!换句话说,它崩溃了。但是,当我使用向量而不是数组时,甚至可以通过这种方式精确生成数百万个元素。谁能解释一下?数组是否有某种限制来产生大量数字?

【问题讨论】:

  • 使用 std::vector 将存储放在堆上。堆栈是有限的资源,通常在 1 到 10 MB 之间,具体取决于系统。

标签: c++ arrays vector containers limit


【解决方案1】:

因为array 在堆栈上分配内存,而vector 在堆上分配内存。您也可以在堆上分配array,使用new 或使用shared_ptrunique_ptr,如下所示:

shared_ptr<array<float,N>> a(new array<float,N>{0});
float v = (*a)[10]; // dereference for operator access

【讨论】:

  • 其实std::arraystd::vector对象都是在栈上分配的。但是,std::array 对象包含所有数组数据,而std::vector 对象仅包含一些元数据和一个指向实际数据的指针,这些数据存储在堆上。有关详细信息,请参阅其他答案的 cmets 部分。
【解决方案2】:

这是因为您使用数组分配的内存在堆栈上,而您的程序堆栈不够大,因此在使用数组时会得到stack overflow。但是,当您使用向量时,您会在堆上分配内存。

如果您仍然喜欢使用std::array,可以将数组放在堆上:new std::array&lt;float, N&gt;(0)

【讨论】:

  • 那么,即使我没有使用任何“new”或“make_unique”,上面代码生成的向量也会在堆上?
  • 是的,std::vector 使用堆。它必须这样做,因为向量可以动态调整大小。 std:array 可以入栈,因为它是固定大小的。
  • @MAero2020 vector 对象不会在堆上。但是向量对象非常小,它本身并没有包含元素数组,而是间接指向一个动态分配的数组。
  • @eerorika 感谢您的解释!我有点困惑,最终,向量元素是否会在堆上
  • 您指向 SO 的链接是针对维基百科的。一秒钟将修复...
猜你喜欢
  • 2015-10-01
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
  • 2018-03-09
  • 1970-01-01
  • 2021-09-28
  • 2015-03-08
相关资源
最近更新 更多