我很好奇是否可以确定数组在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
?
我实际上并不需要这个,这个问题是为了好奇。
答案 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来立即使用它。