用C ++创建一个大数组

时间:2010-06-29 03:09:09

标签: c++

  

可能重复:
  Segmentation fault on large array sizes

大家好

我正在尝试使用C ++在VS 2010中创建一个非常大的数组。

当我尝试创建如下所示的数组时

int dp[4501][4501]
or
int dp[1000][1000]

它抛出异常“Stack Overflow” 然后我将其更改为:

int dp[100][100]

一切都很好。

因此,如果我想创建一个像上面这样的大数组,我该怎么办?

最诚挚的问候,

8 个答案:

答案 0 :(得分:9)

使用动态分配或STL。最近有一个关于一个非常相似问题的帖子。请参阅this

答案 1 :(得分:6)

将其放在the heap上。

答案 2 :(得分:5)

您应该使用动态分配:

typedef std::vector<int> int_vector;
int_vector dp(10000);

可以通过嵌套数组来模拟双数组:

typedef std::vector<int_vector> int_double_vector;
int_double_vector dp(4501, int_vector(4501));

答案 3 :(得分:1)

答案 4 :(得分:1)

您的堆栈溢出了太多位。你必须把它们排干。最好是堆在其他位上。我建议/ F67108864。 / F代表“ F'ing hell为什么堆栈与堆相比如此之小?”。 67108863是任意的。

答案 5 :(得分:1)

如果您想避免使用new[]或避免使用std::vector,请将数组设为全局。这会将数组放在堆上,不会发生堆栈溢出。

答案 6 :(得分:0)

您的声明看起来有点像dp将用作矩阵。在这种情况下,专用(密集)矩阵类(如boost::numeric::ublas::matrix)是最简单的解决方案,比矢量矢量更容易,更局部。如果矩阵是稀疏填充的,则改为使用稀疏矩阵类。

答案 7 :(得分:0)

  

所以如果我想创建一个大数组   如上所述,我该怎么办?

避免在这些情况下使用堆栈(换句话说,避免创建类似于在函数内部工作时未分配堆的数组)。只是为了给你一个想法,我的线程局部堆栈只有16千字节大。 4501 * 4501 * 4(假设每个int 4个字节)= ~81兆字节。

请考虑这样的事情:

typedef vector<int> Row;
typedef vector<Row> Matrix;
Matrix dp(4501, Row(4501) );

如果要创建10x50矩阵:

Matrix dp(10, Row(50) );

你可以像普通的dp数组一样使用它,因为它没有溢出堆栈。这个将被分配并自动从堆中解除分配,这样你就不必担心堆栈溢出了。

dp[5][10] = 123;
祝你好运!

[编辑]还有一些矩阵解决方案值得研究,但考虑到主题的性质,建议提升可能有点为时过早。