拥有大型二维数组:静态int vs int

4
在解决一个动态规划相关的问题时,我发现第一个方案可以运行,但第二个会出现段错误。 实际原因是什么?只使用int类型的内存限制是多少?
int main(){
    static int a[3160][3160];
    return 0;
}

int main(){
    int a[3160][3160];
    return 0;
}

可能是数组大小限制的重复问题。 - Bo Persson
2个回答

5
由于您可能没有足够的堆栈内存来存储那个大数组。
第二个示例在堆栈上创建一个数组,而第一个示例创建一个数组,该数组未位于堆栈上,而是位于数据/ Bss段中,因为您使用static限定符显式指定了存储条件。
请注意,C ++标准未指定堆栈、堆或数据段、Bss段等细节,这些都是实现定义的细节。标准仅指定了使用不同存储条件声明的变量所期望的行为。因此,变量实际创建的位置是实现定义的,但有一件事是肯定的,即您的两个示例将在不同的内存区域创建数组,并且第二个示例会崩溃,因为该区域的内存不足。
此外,如果您在实际实现中创建了如此巨大的数组,则您的设计似乎存在缺陷,您可能需要重新考虑它。

你可能还想考虑使用 std::arraystd::vector,而不是传统的c风格数组。


"这些示例将在不同的内存区域创建数组"。我认为会发生什么 - 简洁明了,如果没有其他答案,我会选择这个 :) - Anil Shanbhag

1

这么大的堆栈分配是不安全的(除非您能够满足该保证)。

堆栈大小因平台/硬件而异。因此,“内存限制”变化巨大。如果您使用像这样的大型堆栈数组,请准备好在运行程序时看到此错误,特别是在与开发所用处理器不同的处理器上运行时。如果您绝对需要如此大的堆栈,则必须创建具有显式堆栈大小的自己的线程。

然而,这种措施并不需要,因为您应该在此处使用动态分配。

static不是重新进入的好选择。

正如Als指出的那样(+1)-运行时错误的原因很可能是堆栈大小。


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