当我编写以下程序时,它可以正常工作,即位集数组是在 main() 方法之外声明的。
正确工作
#include <iostream>
#include <bitset>
using namespace std;
bitset<5000> set[5000];
int main(){
cout<<"program runs fine"<<endl;
return 0;
}
但是当我在 main 方法中创建它时,我得到了堆栈溢出异常。谁能详细解释这里发生了什么?通常我会在递归方法中看到堆栈溢出异常。那么谁在这里使用堆栈?
#include <iostream>
#include <bitset>
using namespace std;
int main(){
bitset<5000> set[5000];
cout<<"program runs fine"<<endl;
return 0;
}
不起作用并抛出堆栈溢出异常
在 main 中声明它就是在“自动存储”也就是堆栈中声明它。在 main 之外声明它,就是在“静态存储”AKA 全局数据中声明它。您正在声明大量数据。 std::bitset<5000>
在我的 VS2013 系统上是 632 字节(可能与 5000/8 对齐)。您要申报其中的 5000 个。 5000 * 632 = 3 160 000 字节,或大约 3 兆字节。 VS2013 中的默认堆栈为 1 兆字节,这就是您看到溢出的原因。
存储有自动、存储、动态三种。这些通俗地分别称为堆栈、静态(在某些情况下,全局)和堆内存:
int static_int;
int main() {
int automatic_int;
static int local_static_int; // also static storage!
int * dynamic_int_ptr = new int;
}
- 自动存储在编译时/运行时混合分配。堆栈在运行时扩展到一个函数以保存局部变量,但这是一个已知的编译时值,因为变量的数量和它们的大小是众所周知的(我在这里忽略动态数组,因为它们是非-standard) 这些变量在范围进入时构造,并在范围退出时销毁。
- 静态存储在编译时分配。此内存是预先支付的,并在程序启动时构建。它在程序退出时被破坏。
- 动态存储在运行时分配。此内存由
new
分配并返回指向保存 Shiny 新数据的某个 blob 的指针。这些变量是在 new
时构造的被调用,并在 delete
时销毁被称为。