在C++中全局和大小为10^7的函数内声明数组时出现问题[重复]

问题描述 投票:0回答:3

在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.

    
c++
3个回答
0
投票

局部变量(例如函数作用域)和全局变量通常存储在进程(线程)堆栈上。您的大小的数组(我假设是 10^7 字节)无法放入典型的堆栈中,即使它是那里唯一的东西(事实并非如此)。典型堆栈大小最大为 8 MiB,您的阵列至少有 9 MiB 大。

使用动态分配,例如;

std::vector
用于封装的动态分配,如
std::array
,或 C 样式数组在堆栈上分配。


0
投票

是否因为某些堆栈大小限制了内存消耗??

是的,在大多数环境中堆栈的限制非常小。您的 10^7 数组的大小约为 10 MiB 乘以

sizeof(element)
,这比大多数默认堆栈大小都大。

您可以通过告诉操作系统、链接器或程序加载器来增加限制,但这是一个坏主意。考虑一下如何计算该限制。你需要它更大,但到底有多大呢?如果一个函数调用另一个函数然后又调用另一个函数怎么办?单个时间点有多少个数组?函数会递归吗?

最好使用堆来实现这一点。这意味着动态分配内存。对于连续的数据块,最好的选择是使用

std::vector


0
投票

这是因为在函数中声明的局部变量将分配在堆栈内存空间中。普通规格的堆栈大多是每个进程 1MB 或 8MB,无法容纳 10^7 个整数或浮点数。

相反,全局变量将分配在数据段中。数据段大小限制足够大,可以全局分配10^7大小的数组。

关于各类变量位置的更多说明,可以参考下面的url。

C 中的变量存储在内存中的什么位置?

© www.soinside.com 2019 - 2024. All rights reserved.