32位意味着4G的寻址空间,Linux把它分为两部分:最高的1G(虚拟地址从0xC0000000到0xffffffff)用做内核本身,成为“系统空间”,而较低的3G字节(从0x00000000到0xbffffff)用作各进程的“用户空间”。这样,理论上每个进程可以使用的用户空间都是3G。当然,实际的空间大小收到物理存储器大小的限制。虽然各个进程拥有其自己的3G用户空间,系统空间却由所有的进程共享。从具体进程的角度看,则每个进程都拥有4G的虚拟空间,较低的3G为自己的用户空间,最高的1G为所有进程以及内核共享的系统空间。
可是经自己测试:
堆区最多开2G - 1大小空间
栈区能开1G多,当接近2G就会报错
[html] view plain copy print?
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string.h>
const long long MAXN = 1073741824//2^30即1G
using namespace std
char s[MAXN * 2 - 1]//开2G内存,多1个都会编译错误(提示:整数溢出之类的错误)
int main()
{
char t[MAXN + 1000]//之内开1G多的空间,2G会编译不通过
memset(t, 0, sizeof(t))
memset(s, 0, sizeof(s))
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)