C++中堆栈、静态和堆内存的最大内存
Maximum memory for stack, static and heap memory in C++
我正试图在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的工作方式与此类似。
相关文章:
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 类型总是使用其大小存储在内存中吗
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存