堆栈溢出:数组的数组

5

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

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

我快速查看了数组的索引数组,发现在上述声明执行时它已经被填充了值。没问题。

但是!当我调用另一个函数并使用该索引数组时,其声明如下:

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

我遇到了一个未处理的异常(Stack Overflow),然后被重定向到一个asm文件(chkstk.asm):

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

有什么办法可以解决这个问题吗?
5个回答

4

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


那么解决方案是选择动态数组的数组,如何使用new来编写array<...<...,..>>? - MelMed
2
@MelMed:我建议使用vector<array<double,1000>> index(1000);。直接使用new通常是个不好的主意。 - Mike Seymour
@MelMed:解决方案是修改平均函数以接收指针。 - user598398
1
为什么要使用新的数据结构?为什么不使用vector<array<>>? - Balog Pal

3

以动态方式(避免栈溢出)以二维方式声明1000 x 1000的双精度浮点数的方法是:

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

-编辑- 正如Mike Seymour在评论中建议的那样,应该尊重功劳归于原作者... ;)

Index的类型为std::vector<std::array<double,1000>>,因此您需要使用相同的参数。

void average (..., std::vector<std::array<double,1000>> & index, ...)

@BalogPal 你的意思是平均值采用索引(按值)而不是&索引(按引用,这可能需要使用const&)吗? - doctorlove
@MelMed 使用 operator[] 将返回一个对 std::array<double,1000> 的引用,然后可以使用 operator[] 访问其中的每个 double 元素。因此,您仍然可以使用 index[i][j] 来访问您的元素。 - Pixelchemist
你甚至可以获得快速交换()的能力,但你可能会遭受意外的resize()。它将继续工作。 - Balog Pal
@Pixelchemist 谢谢,但还有其他问题困扰我:当将函数声明为例如 void average(..., vector<array<double,1000>> & index(1000), ...) 时,它会提示第二个1000期望类型说明符! - MelMed
@Pixelchemist +1!谢谢。 - MelMed
显示剩余2条评论

0

嗯,由于您没有将指向"index"的指针传递给平均函数,您的对象(即数组)将在堆栈上重新构建(复制)。 我不确定默认情况下堆栈大小是多少,但您仅用于数组就耗用了约8MB的空间,这是一个不好的主意。


0

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

  • sizeof(array,1000>) 大约为 8 兆字节
  • 通常堆栈较小,因此在以下情况下会遇到问题:
    1. 创建这样的本地变量
    2. 按值传递它

如果堆栈剩余空间较少,则行为是未定义的。在调试构建中,您可能会很幸运地得到一个相关的消息来解决问题。在典型的发布构建中,堆栈检查被关闭,使您处于野外。

由于您的对象现在位于命名空间中,所以可以通过引用来解决即时问题。这通常是一个好主意。

如果您无法避免列出的问题使用,您必须减少类的大小。最简单的解决方案是将其制作成 vector<array<double,1000>>,并使用大小构造函数立即拥有整个大小。


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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接