对于计算机内存模型,我认为可按 数组 模型进行类比。将计算机的内存结构等同于 数组 存储结构(其实这里反过来才是正确的,数组存储的模型是依照计算机的内存模型进行存储的,但这里为了更容易理解,就将其反过来思考)。

    一般而言,对于不同的机器,其内存高低字节存储位置可能不同,这就是所谓的大端小端。这也给我们的理解带来困惑。

    而在我的机器上,我测试出来的结果是:以竖直内存模型分析,低地址在上,高地址在下方。

验证程序:

#include "stdafx.h"
#include <iostream>

using std::cout;
using std::endl;


int _tmain(int argc, _TCHAR* argv[])
{
	int a = 1;
	int  b = 2;
	int c = 3;
	cout << &a << endl;
	cout << &b << endl;
	cout << &c << endl;
	
	system("pause");
	return 0;
}

测试结果:

计算机内存模型 粗浅理解_内存模型

分析:

从测试结果可以看出,&a > &b >&c,因为这里是在 栈 上创建变量的,栈的特点是先进后出,所以当a创建时,它进入栈内;当b创建时,a就会被往下压,然后b在进入栈内;同理,当c被创建时,a和b同时进行压栈动作后,c才入栈。此时的内存模型就如:c-->b-->a;而a的地址最大,c的最小,换成竖直方向来看,可知,越往下地址值越大。


    为什么我说计算机内存模型可等同于 数组 存储模型呢,请看以下程序:

#include "stdafx.h"
#include <iostream>

using std::cout;
using std::endl;


int _tmain(int argc, _TCHAR* argv[])
{
	char arr[3] = { 1, 2, 3 };
	cout << std::hex;
	cout << "&arr[0] = " << (int)&arr[0] << endl;
	cout << "&arr[1] = " << (int)&arr[1] << endl;
	cout << "&arr[2] = " << (int)&arr[2] << endl;

	system("pause");
	return 0;
}

测试结果:

计算机内存模型 粗浅理解_计算机_02

分析:

从测试结果中可知,数组的排列方式跟我们上面分析的内存模型排列方式一样,也是低地址在上面,高地址在下面(简单记:高对高,低对低--数组低位对应内存低位,数组高位对应内存高位)。