具有大的2d数组:静态int与int
Having large 2d arrays : static int vs int
在解决与DP相关的问题时,我观察到第一个问题有效,但第二个seg错误。实际原因是什么?只使用int的内存限制是多少?
int main(){
static int a[3160][3160];
return 0;
}
int main(){
int a[3160][3160];
return 0;
}
因为您可能没有足够的堆栈内存来存储那个大数组。
第二个示例在堆栈上创建一个数组,而第一个示例创建的数组不在堆栈上,而是在data/Bss段中的某个位置,因为您使用static
限定符显式指定了存储条件。
注意,c++标准没有指定stack
或heap
或data segment
或Bss segment
,这些都是实现定义的细节。该标准仅指定使用不同存储条件声明的变量的预期行为。因此,其中变量实际上是创建的是实现定义的,但有一点可以肯定,您的两个示例都会在不同的内存区域中创建数组,第二个示例会崩溃,因为该区域中没有足够的内存。
此外,如果你在实际实现中创建了一个如此巨大维度的数组,你的设计可能会有缺陷,你可能需要考虑重新访问它
您可能还想考虑使用std::array或td::vector,而不是传统的c样式数组。
这么大的堆栈分配是不安全的(除非你要满足这个保证)。
堆栈大小因平台/硬件而异。因此,"内存限制"变化很大。如果您使用这样的巨大堆栈数组,请准备好在程序运行在非用于开发的处理器上时经常看到此错误。如果绝对需要这么大的堆栈,则必须创建具有显式堆栈大小的自己的线程。
但是,不需要该度量,因为您只需要在此处使用动态分配。
如果您需要static
是可重入的,那么它不是一个好的选择。
正如Als所指出的(+1)-运行时错误的原因很可能是堆栈大小。
相关文章:
- 枚举成员与静态 int 成员?
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- 将 static_cast<int>(-15) 分配给静态常量字符类型变量
- std::out_of_range 在静态 int 变量上
- 打印一个带有静态 int 的函数,有一个 std::cout 和多个 std::cout 有什么区别?
- 错误:无效使用非静态成员函数"int test::hotplug_callback(libusb_contex
- 覆盖性静态分析说无符号的int是char(C++)
- 缺少类型说明符 - int 假定 声明静态成员后出错
- 是否应该避免这种从 int 到双精度的静态转换?
- 无效使用非静态成员函数 int test::funcAB(int, int)
- C 未解决的外部符号(公共静态INT)
- 如何从方法返回静态常量 int std::array?
- 如果可以将其放在私有中,为什么要使用静态常量(int/string/.)?
- 如何在C++中静态铸造 2D 矢量大小()(size_t 到 int)
- 如何添加到静态 int +1
- 为什么c++编译器接受这种初始化?静态int x=x
- 如何调用函数来返回静态私有int
- 静态 int 和 int 在 C++ 类中的区别
- 静态 (<int>PASS_OBJECT) 模板化数组在创建所述类型的对象时丢失数据?
- 错误:无效使用非静态数据成员"容量"int data[容量];