当前位置:C++技术网 > 资讯 > 内存模型与指针以及变量的关系

内存模型与指针以及变量的关系

更新时间:2015-06-24 21:30:00浏览次数:1+次

    以下是内存模型示意图:

内存模型示意图

    下面详细解释:

    首先我们必须了解的三个概念。

    1.我们一般编程所说的内存是虚拟内存。
    我们编程提到的内存都是抽象的概念,是虚拟的内存,并不是实在的物理内存。物理内存就是我们看得到摸得着的内存条。而我们需要了解的就是虚拟内存。出了写驱动等级别的程序外,一般是不需要了解具体的内存的,操作系统会将虚拟内存转换成物理内存。

    2.虚拟内存是进程所在的地址空间。
    虚拟内存是给每一个进程的一个内存空间。每一个进程都有一个虚拟内存空间,进程之间的虚拟内存是隔绝的,相互不能重叠。
    而虚拟内存的大小则是根据操作系统的位数来决定的,比如32位操作系统,则虚拟内存大小为2的32次方减一。这个通常叫做进程的地址空间。
    如果进程间需要通信,则需要通过进程间通信(IPC)来实现。这是虚拟内存的一个补充机制。

    3.虚拟内存内存是线性的。
    物理内存的实现,和具体的内存品牌公司的策略有关。实际的物理内存很多都不是线性排开的,但是通过内存机制,对外展示成线性的逻辑地址,即从0一直到最大地址。而这个逻辑的内存模型,则表现在系统中的虚拟内存则是在此基础上的进一步的抽象。不过,只要记住一点,虚拟内存是线性的。线性即表示在一条线上就可以表示所有的地址,而不需要通过几个层次结构来定位一个内存地址。

    其次,来解释内存与指针的关系。
   
    指针是一个类型,占用的字节数与操作系统的位数有关。而操作系统的位数,决定虚拟内存的大小。如果是32位,则虚拟内存地址就是2的32次方个字节;如果是64则虚拟内存地址就是2的64个字节。
    而这么大的地址,需要指针能够全部索引到。所以,指针的值必须能够表示这么多个数字,而在32位操作系统中,则指针的值需要能够表示2的32次方个数,那么需要的就是32位的内存,即4字节。所以在32位系统中,指针只要是4字节就够了。不管是什么类型的指针,都是4字节。而在64位系统中,需要64位的指针,即8字节的指针。这4字节或者8字节就是必需的大小。
    如果指针超过这个需要的值,纯粹是浪费,如果小于这个需要的值,则不能够所引到内存的后面的部分。这也是,32位操作系统支持的最大内存是4GB,多了指针无法索引到,也就无法操作大于4GB内存位置。
    然后,内存地址是什么?
    内存地址,由上图可以看出,内存地址就是内存单元的编号而已。
    最后,变量就是一个大小的内存块,而变量名就是一个符号,由编译器处理,然后将内存块映射到变量。因此对变量的操作其实就是对对应的内存块的操作。