具有大的2d数组:静态int与int

Having large 2d arrays : static int vs int

本文关键字:int 静态 数组 2d      更新时间:2023-10-16

在解决与DP相关的问题时,我观察到第一个问题有效,但第二个seg错误。实际原因是什么?只使用int的内存限制是多少?

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

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

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

注意,c++标准没有指定stackheapdata segmentBss segment,这些都是实现定义的细节。该标准仅指定使用不同存储条件声明的变量的预期行为。因此,其中变量实际上是创建的是实现定义的,但有一点可以肯定,您的两个示例都会在不同的内存区域中创建数组,第二个示例会崩溃,因为该区域中没有足够的内存。

此外,如果你在实际实现中创建了一个如此巨大维度的数组,你的设计可能会有缺陷,你可能需要考虑重新访问它

您可能还想考虑使用std::arraytd::vector,而不是传统的c样式数组。

这么大的堆栈分配是不安全的(除非你要满足这个保证)。

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

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

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

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