关于C++的内存管理,先还是要上基础
对内分配
就32位操作系统来讲,其最大寻址空间为2^32 = 4294967296(bit)= 4(GB)左右
而4GB不会全部放到进程使用,大概有2GB使用空间(低端地址0X00000000~0X7FFFFFFF),而另外2GB(高端地址0X80000000~0XFFFFFFFF)会留给操作系统内核代码使用。
在Windows和Linux平台上,一些动态链接库(Windows的dll,Linux的so)以及ocx(包含ActiveX控制的库)控件等,由于是垮进程服务的,一般也在高2GB内存空间运行。
char szBuffer[2*1024*1024*1024];
由于在实际运行时,程序还有代码段、临时变量段,动态内存申请等,实际上是不可能用到上述那么大的数组的。
每个进程都能看到自己的2GB内存以及系统的2GB内存,但是不同进程之间是无法彼此看到对方的。当然,操作系统在底层做了很多工作,比如磁盘上的虚拟内存交换,不同内存块动态映射等等。
虚拟内存
虚拟内存的基本思想是:用廉价但缓慢的磁盘来扩充快速但昂贵的内存。在一定时刻,程序实际需要使用的虚拟内存区段的内容就被载入物理内存中。当物理内存中的数据有一段时间未被使用,它们就可能被转移到硬盘中,节省下来的物理内存控件用于载入需要使用的其他数据。
在进程执行过程中,操作系统负责具体细节,使每个进程都以为自己拥有整个地址空间的独家访问权。这个幻觉是通过“虚拟内存”实现的。所有进程共享机器的物理内存,当内存使用完时就用磁盘保存数据。在进程运行时,数据在磁盘和内存之间来回移动。内存管理硬件负责把虚拟地址翻译为物理地址,并让一个进程始终运行于系统的真正内存中,应用程序员只看