在C++中,当我在函数内声明一个大小为10^7的数组时。我无法这样做。但是,当我在全局范围内声明这个数组具有相同的大小时,一切都运行得非常好。我的意思是=>假设我在函数中声明数组
void ArrayReturn(){
int N = 1e7+10;
int arr[N]={0}; //When I try to output the content of this array
// there is a blank screen only.
// Now I start performing seive
}
但是,在我全局声明 arr 的同时,输出也很好
int arr[10000010];
void ArrayReturn(){
//perform sieve
//output which uses the content of this array, comes fine now.
}
So, I just wanna know whether this issue is because something related to memory assigned to a function over stack is limited, or is there something else that I am missing or don't know at all?
Kindly explain.
局部变量(例如函数作用域)和全局变量通常存储在进程(线程)堆栈上。您的大小的数组(我假设是 10^7 字节)无法放入典型的堆栈中,即使它是那里唯一的东西(事实并非如此)。典型堆栈大小最大为 8 MiB,您的阵列至少有 9 MiB 大。
使用动态分配,例如;
std::vector
用于封装的动态分配,如 std::array
,或 C 样式数组在堆栈上分配。
是否因为某些堆栈大小限制了内存消耗??
是的,在大多数环境中堆栈的限制非常小。您的 10^7 数组的大小约为 10 MiB 乘以
sizeof(element)
,这比大多数默认堆栈大小都大。
您可以通过告诉操作系统、链接器或程序加载器来增加限制,但这是一个坏主意。考虑一下如何计算该限制。你需要它更大,但到底有多大呢?如果一个函数调用另一个函数然后又调用另一个函数怎么办?单个时间点有多少个数组?函数会递归吗?
最好使用堆来实现这一点。这意味着动态分配内存。对于连续的数据块,最好的选择是使用
std::vector
。
这是因为在函数中声明的局部变量将分配在堆栈内存空间中。普通规格的堆栈大多是每个进程 1MB 或 8MB,无法容纳 10^7 个整数或浮点数。
相反,全局变量将分配在数据段中。数据段大小限制足够大,可以全局分配10^7大小的数组。
关于各类变量位置的更多说明,可以参考下面的url。