以编程方式在C ++中查找最大静态数组大小

时间:2012-03-31 05:25:00

标签: c++ memory

我很好奇是否可以确定数组在C ++中可以拥有的最大大小。

    #include <iostream>

    using namespace std;

    #define MAX 2000000

    int main()
    {
      long array[MAX];
      cout << "Message" << endl;
      return 0;
    }

这个编译得很好,但是一旦我运行它就会出现段错误(即使实际上没有引用数组)。我知道这也是数组大小,因为如果我将其更改为1000000它运行得很好。

那么,是否有一些定义某处或某种方式有#define MAX MAX_ALLOWED_ARRAY_SIZE_FOR_MY_MACHINE_DEFINED_SOMEWHERE_FOR_ME

我实际上并不需要这个,这个问题是为了好奇。

4 个答案:

答案 0 :(得分:10)

没有办法静态地确定这个,因为实际的限制取决于你的线程给出了多少堆栈空间。你可以创建一个新的线程,给它10兆字节的堆栈,你就可以分配一个相应更大的本地数组。

您可以在堆栈上分配的金额也取决于到目前为止已经使用了多少。

答案 1 :(得分:4)

void foo(int level){
 int dummy[100];
 cerr<<level<<endl;
 foo(level+1); 
}

然后,也许您可​​以将最后打印的级别乘以400个字节。递归调用占据了我猜的大部分堆栈空间,但你可以得到一个下限。我可能会错过对内存管理的一些理解,因此可以更正。

所以这就是我在机器上得到的具有不同虚拟阵列大小的内容。

level   array size    stack total
24257     100      9702800
 2597    1000     10388000
  260   10000     10400000
  129   20000     10320000
   64   40000     10240000
   25  100000     10000000
   12  200000      9600000

答案 2 :(得分:2)

在函数内声明的大多数变量都是在the stack上分配的,它基本上是一个固定大小的内存块。尝试分配大于堆栈大小的堆栈变量将导致stack overflow,这是由段错误引起的。

堆栈的大小通常为8MB,因此,在64位计算机上,long max[1000000]的大小为8*1000000 < 8MB(堆栈为“安全”),但long max[2000000]的大小8*2000000 > 8MB,因此堆栈溢出,程序段错误。

另一方面,使用malloc动态分配数组会将内存放入the heap,这基本上是无限制的(32位机器上为4GB,64位机器上为17,179,869,184GB)

答案 3 :(得分:1)

请阅读this以了解硬件和编译器设置的限制。我不认为你可以定义一个MAX来立即使用它。