通过编程察看处理机的内存管理策略
内存是处理机可以直接访问(读写)的计算机存储设备,它由一系列的存储单元组成。而一个内存单元是一个基于晶体管的电子元件,它有两种可以映射为“1”和“0”的状态。处理机的内存管理策略有两种:升序 和降序。
在升序管理机制中,内存是由下往上升序排列的。也就是说,低地址的内存在底部,而高地址的排列在顶部;而在降序管理机制中与此相反。这是两种截然不同的策略,虽然都为了更好的存储数据,和有效的利用内存单元。
我们一般都不会关心这些机制的,应为这是由硬件提供商在处理机设计的时候决定的。我们只管用就行了。我们在写程序时一般只考虑其中的逻辑机构,而不是武力机构,除非你写的是嵌入式程序而且为了提高效率和内存的利用率不得不通过底层操作直接进行内存管理(这时候,内存显得很重要不得随便浪费)。
程序是由指令和数据组成的。对于只有一字节的数据我们可是用它的地址来指示该数据。但是对于多字节数据就不能这样冒昧的操作了。多字节数据在内存中的存放方式有升序和降序两种。如果多字节数据中高位被放在低地址内存单元,而低位被放在高地址内存单元,那么我们就说它采用的是降序记号,反之为升序记号。这也是有具体的处理机的内存管理机制决定的。我们没有能力也没有必要去改变这种机制,不过我们可以通过编程看看自己的处理机采用的是哪一种机制。
假设我们有一个多字节值“0xABCDEF12“,那么在升序排列机制下的次序为: ABCDEF12
否则,为12EFCDAB。
你可以通过下面的程序的输出结果看看你的处理的管理机制了:
#include <stdio.h>
void main(int argc, char *argv[]) {
unsigned long test = 0xABCDEF12;
unsigned char *pointer;
pointer = (unsigned char *)&test;
printf("%X %X %X %X \n", *pointer,*(pointer+1),*(pointer+2),*(pointer+3) );
return;
}
如果采用的降序记号方式,那么结果是: 12 EF CD AB