用程序在C++中找到最大静态数组大小

Programmatically find maximum static array size in C++

本文关键字:静态 数组 程序 C++      更新时间:2023-10-16

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

    #include <iostream>
    using namespace std;
    #define MAX 2000000
    int main()
    {
      long array[MAX];
      cout << "Message" << endl;
      return 0;
    }

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

那么,有没有什么地方或某种方式可以定义#define MAX MAX_ALLOWED_ARRAY_SIZE_FOR_MY_MACHINE_DEFINED_SOMEWHERE_FOR_ME

我其实什么都不需要这个,这个问题只是为了好奇。

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

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

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

函数内部声明的大多数变量都是在堆栈上分配的,堆栈基本上是一个固定大小的内存块。试图分配一个大于堆栈大小的堆栈变量会导致堆栈溢出,这就是segfault的原因。

堆栈的大小通常为8MB,因此,在64位机器上,long max[1000000]的大小为8*1000000 < 8MB(堆栈是"安全的"),但long max[2000000]的大小为8*2000000 > 8MB,因此堆栈溢出并导致程序分段故障。

另一方面,使用malloc动态分配数组会将内存放入堆中,堆基本上是无限制的(32位机器上为4GB,64位机器上则为17179869184GB)。

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