|

楼主 |
发表于 2016-12-17 11:56:32
|
显示全部楼层
回 eric2013 的帖子
eric2013:你的理解有误,一个地址仅对应一个字节。
0X68000000  是一个字节
0X68000001  是一个字节
....... (2016-12-17 11:33)  嗯是的,可能是我表达的意思不够清楚,0X68000000、0X68000001是逻辑地址的两个字节比如正好对应16位总线的一次读写地址,在如:
byte C; //地址是0X68000002,如果是字节对齐,以上3个地址应该只占用物理存储的3个字节,如果是2字节对齐的话上面的3个字节变量应该是占用物理地址6个字节没错吧?
先假设我上面说的是正确的,那么内存分配很可能会这样
当字节对齐时BYTE A,B,C,地址分别是0X68000000、0X68000001、0X68000002,实际占用物理内存时的物理地址A和B被分配在物理地址0的高字节和低字节,C被分配在物理地址1的低字节(因为是16位数据总线,支持高低字节存储访问),这样只占用了物理地址的3个字节
如果是2字节对齐,这个时候逻辑地址与物理地址的数据总线存储特性一致,
BYTE A、B、C分别被分配到物理地址0、1、2,这样实际是占用了6个字节存储空间
在假设我上面的分析是正确的,如下:
字节对齐时:
BYTE A,B,C; //分别按照物理地址高低字节存储(A和B占用物理地址0、C占用物理地址1的低8位)
UINT16 D; //因为D是双字节变量,就会被拆开分别分配到物理地址1的高字节和物理地址2的低字节,这样访问变量D时处理器需要访问两次外部存储器?
如果是双字节对齐就不会出现以上问题,同时定义UINT32 E;//双字节对齐同样是访问两次,如果按照上面的结构就会访问3次。 |
|