如何在C ++中确定内存量?

时间:2011-11-04 03:54:38

标签: c++ memory

我有兴趣了解自动和动态分配变量的内存限制,所以我测试了类似的东西:

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限制(对于动态分配的变量)。我认为它与我的机器有关?另外,有没有办法增加限制,万一我确实需要它?

3 个答案:

答案 0 :(得分:4)

语言不需要任何东西。这都是实现定义的。

自动变量通常会进入堆栈,通常可以通过编译器选项增加最大大小。免费存储通常是堆,并且仅受可用地址空间的限制。在32位环境中不要指望超过2-3GB,在64位环境中限制会更高。当然,您将无法分配所有64位地址空间,您将达到可用虚拟内存的限制(RAM +交换空间)。

答案 1 :(得分:2)

自动变量的限制是为机器堆栈分配的内存量。 10MB实际上相当高; 1或2 MB是更常见的默认值。

显然,3GB是操作系统限制 - 它大致是操作系统允许的程序空间大小。操作系统和硬件平台的差异很大。

答案 2 :(得分:0)

可以通过移动到64位操作系统(有足够的RAM)来修复3 GB的限制。

有一个合理的机会(但不确定)可以通过一些链接器标志来调整10 MB的限制。