我有兴趣了解自动和动态分配变量的内存限制,所以我测试了类似的东西:
int main() {
const int N = 1000000;
int a[N];
a[1] = 100;
}
我发现不会产生分段错误的最大N是2,600,000,大约10MB。
然后我测试了动态分配的变量,如下所示:
int main() {
const int N = 1000000;
int* a = new int [N];
delete[] a;
}
我发现不会抛出异常的最大N大约是730,000,000,大约是3GB。
现在问题是,如何确定10MB限制(对于自动变量)和3GB限制(对于动态分配的变量)。我认为它与我的机器有关?另外,有没有办法增加限制,万一我确实需要它?
答案 0 :(得分:4)
语言不需要任何东西。这都是实现定义的。
自动变量通常会进入堆栈,通常可以通过编译器选项增加最大大小。免费存储通常是堆,并且仅受可用地址空间的限制。在32位环境中不要指望超过2-3GB,在64位环境中限制会更高。当然,您将无法分配所有64位地址空间,您将达到可用虚拟内存的限制(RAM +交换空间)。
答案 1 :(得分:2)
自动变量的限制是为机器堆栈分配的内存量。 10MB实际上相当高; 1或2 MB是更常见的默认值。
显然,3GB是操作系统限制 - 它大致是操作系统允许的程序空间大小。操作系统和硬件平台的差异很大。
答案 2 :(得分:0)
可以通过移动到64位操作系统(有足够的RAM)来修复3 GB的限制。
有一个合理的机会(但不确定)可以通过一些链接器标志来调整10 MB的限制。