繁体   English   中英

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

[英]Programmatically find maximum static array size in C++

我很好奇是否可以确定数组在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

我实际上并不需要这个,这个问题是出于好奇的缘故。

没有办法静态地确定这个,因为实际限制取决于你的线程给出了多少堆栈空间。 你可以创建一个新线程,给它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位机器上为17,179,869,184GB)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM