拥有大型2d数组:static int vs int

时间:2012-01-29 09:11:37

标签: c++ arrays

在解决与DP相关的问题时,我观察到第一个工作但第二个seg故障。 什么是实际原因以及使用int的内存限制是多少?

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

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

2 个答案:

答案 0 :(得分:5)

因为你可能没有足够的堆栈内存来存储那个大数组。

第二个示例在堆栈上创建一个数组,而第一个示例创建一个不在堆栈上但在data / Bss段中某处的数组,因为您使用static限定符明确指定了存储条件。

请注意,c ++标准未指定stackheapdata segmentBss segment这些都是实现定义的详细信息。该标准仅指定使用不同存储条件声明的变量的预期行为。所以,其中变量实际上是创建的是实现定义但有一点可以肯定的是,你的例子都会在不同的内存区域创建数组,第二个会崩溃,因为那里该地区的记忆力不足。

此外,如果您在实际实施中创建如此巨大尺寸的数组,您的设计似乎存在缺陷,您可能需要考虑重新访问它。

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

答案 1 :(得分:1)

大的堆栈分配是不安全的(除非你要履行该保证)。

堆栈大小因平台/硬件而异。因此,“内存限制”变化很大。如果您使用这样的大型堆栈数组,那么当您的程序在用于开发的处理器之外的处理器上运行时,请准备好经常看到此错误。如果绝对需要一个大的堆栈,则必须使用显式堆栈大小创建自己的线程。

但是,不需要该度量,因为您应该在此处使用动态分配。

static如果您需要它是可重入的,则不是一个好的选择。

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