4

我正在计算一些值并使用如下函数将它们存储在变量中:

array<array<double,1000>,1000> index;
sum(double A, ..., array<array<double, 1000>,1000> & index);

我快速查看了数组的索引数组,它只是在执行上述声明时填充了值。没关系

但!一旦我调用另一个使用索引数组的函数,其声明如下:

average(..., array<array<double,1000>,1000> index, ...) 

我收到一个未处理的异常(堆栈溢出),它将我重定向到一个 asm 文件(chkstk.asm):

 test    dword ptr [eax],eax     ; probe page.

知道如何解决这个问题吗?

4

5 回答 5

4

默认情况下,Win32 中的每个线程都有 1 MB 的堆栈空间,而一百万个双精度数将占用 8 MB 的堆栈空间。解决方案是使用new.

于 2013-06-19T11:28:51.450 回答
3

A dynamic way (to avoid stack overflow) of declaring 1000 x 1000 doubles in a 2d fashion is

std::vector<std::array<double,1000>> index(1000);

-edit- As Mike Seymour already suggested in the comments. Honour to whom honour is due... ;)

Index is of type std::vector<std::array<double,1000>> and therefore you'll need to have your arguments like that.

void average (..., std::vector<std::array<double,1000>> & index, ...)
于 2013-06-19T11:35:09.517 回答
0

好吧,由于您没有将指向“索引”的指针传递给平均函数,因此您的对象(即数组)将在堆栈上重建(复制)。我不知道默认情况下堆栈大小是多少,但你只为你的数组使用了大约 8MB,这是一个坏主意。

于 2013-06-19T11:32:09.203 回答
0

好的,让我们组装所有部分:

  • sizeof(array,1000>) 约为 8Mbytes
  • 通常的堆栈较小,所以当你遇到问题时
    1. 创建这样一个局部变量
    2. 按值传递

如果堆栈的剩余空间较少,则行为未定义。在调试版本中,您可能很幸运能得到相关消息来弄清楚。在典型的发布版本中,构建堆栈检查结果使您陷入困境。

由于您的对象现在位于命名空间中,因此可以通过引用传递它来解决直接问题。无论如何,这通常是个好主意。

如果您无法避免列出的有问题的用途,则必须减少班级规模。最简单的解决方案是vector<array<double,1000>>使用 size 构造函数创建它,立即具有整个大小。

于 2013-06-19T11:52:37.603 回答
0

我使用了一个对象 ( Model model = new Model;) 来存储一些向量(数组)。

float fc1[input_dim][hidden_layer_dim_1] = { 0.0 }; float fc2[hidden_layer_dim_1][hidden_layer_dim_2] = { 0.0 }; float fc3[hidden_layer_dim_2][output_dim] = { 0.0 };

我收到此错误是因为尺寸有点大:)。我用这个改变解决了它:

Model model;->> Model *model = new Model;

当我使用指针时,问题就解决了。当然,变量是这样变化的:

model.hidden_layer_dim_1->model->hidden_layer_dim_1

于 2018-12-28T13:09:28.817 回答