C++中堆栈、静态和堆内存的最大内存

Maximum memory for stack, static and heap memory in C++

本文关键字:内存 大内 堆栈 静态 C++      更新时间:2023-10-16

我正试图在C++中找到可以在堆栈、全局和堆内存上分配的最大内存。我正在一个内存为32GB的Linux系统和内存为2GB的Mac上尝试这个程序。

/* test to determine the maximum memory that could be allocated for static, heap and stack memory  */
#include <iostream>
using namespace std;
//static/global
long double a[200000000];
int main()
{
//stack
long double b[999999999];
//heap
long double *c = new long double[3999999999];
cout << "Sizeof(long double) = " << sizeof(long double) << " bytesn";
cout << "Allocated Global (Static) size of a = " << (double)((sizeof(a))/(double)(1024*1024*1024)) << " Gbytes n";
cout << "Allocated Stack size of b = " << (double)((sizeof(b))/(double)(1024*1024*1024)) << " Gbytes n";
cout << "Allocated Heap Size of c = " << (double)((3999999999 * sizeof(long double))/(double)(1024*1024*1024)) << " Gbytes n";
delete[] c;
return 0;
}

结果(两者):

Sizeof(long double) = 16 bytes
Allocated Global (Static) size of a = 2.98023 Gbytes 
Allocated Stack size of b = 14.9012 Gbytes 
Allocated Heap Size of c = 59.6046 Gbytes

我使用的是GCC 4.2.1。我的问题是:

为什么我的程序在运行?我预计,由于堆栈已经耗尽(在linux中为16 MB,在Mac中为8 MB),程序应该会抛出一个错误。我看到了这个话题中提出的许多问题中的一些,但我无法从那里给出的答案中解决我的问题。

在某些系统上,您可以分配适合地址空间的任何数量的内存。当你开始实际使用内存时,问题就开始了。

操作系统为进程保留了一个虚拟地址范围,而没有将其映射到任何物理地址范围,甚至没有检查是否有足够的物理内存(包括交换)来备份该地址范围。只有当进程试图访问新分配的页面时,映射才会以逐页的方式发生。这被称为内存过度使用

尝试访问大数组的每个sysconf(_SC_PAGESIZE)字节,看看会发生什么。

Linux过度调试,这意味着它可以允许进程拥有比系统上可用的更多的内存,但直到该内存被进程实际使用,才为该进程分配实际内存(物理主内存或磁盘上的交换空间)。我的猜测是Mac OS X的工作方式与此类似。