我有兴趣找出自动和动态分配的变量的内存限制是多少,所以我测试了如下内容:
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,也就是大约3 3GB。
现在的问题是,如何确定10MB的限制(对于自动变量)和3 3GB的限制(对于动态分配的变量)。我想这和我的机器有关吧?另外,有没有办法提高限制,以防我真的需要它?
发布于 2011-11-04 12:00:52
自动变量的限制是分配给机器堆栈的内存量。10MB实际上相当高;1或2MB是更常见的默认值。
显然,3 3GB是操作系统的限制--它大致相当于操作系统允许一个程序占用的进程空间大小。它会因操作系统和硬件平台的不同而大不相同。
发布于 2011-11-04 11:59:39
语言不要求任何东西。它都是由实现定义的。
自动变量通常进入堆栈,您通常可以通过编译器选项增加最大大小。空闲存储通常是堆存储,并且仅受可用地址空间的限制。在32位环境下不要超过2-3 3GB,64位环境下的限制会更高。当然,您无法分配所有的64位地址空间,您将达到可用虚拟内存(RAM +交换空间)的限制。
发布于 2011-11-04 11:58:30
3 GB的限制可能可以通过迁移到64位操作系统(有足够的RAM)来解决。
有一个合理的机会(但不确定),10MB的限制可以通过一些链接器标志进行调整。
https://stackoverflow.com/questions/8004703
复制相似问题