奇地址存取的限制

使用RISC指令集的SPARC,MIPS和ARM处理器规定,访问某种数据类型的数据必须从内存中的特定地址开始读取(字节对齐),比如说访问int的必须从能够被4整除的地址进行数据读取,而采用cisc 指令集的x86系列处理器则没有这样的要求(好像他是可以用内部的逻辑电路来实现的),不过出现这样情况的时候访问效率会变差。
 
关于char类型的问题,对char类型数据的访问必须是能够被1整除的地址开始进行数据读取,因为所有地址都是可以被1整除的,所以char类型的访问不存在地址奇偶问题。但是如果new 了一个char的数组,然后取出其中的一个奇数位,然后转型成int这类的来访问,就会出问题的,这需要特别注意
 
说明:

CPUからメモリへのアクセスは、8ビット単位で行ない、一回に8ビット、16ビット、あるいは32ビットの読み書きをします。(64ビットまで可能なものもあります)

一回のアクセス単位が32ビットなら32ビット境界のアドレス、16ビットなら16ビット境界のアドレスにアクセスを限定することで、CPU-メモリ間のハードウェア回路上で信号をやり取りするメカニズムが簡略化・高速化できるので、そういうアーキテクチャを採用している場合は、ソフトウェアもそれに従ってプログラムを組まないといけません。

イメージとしては、メモリ空間が一定のビット幅で帯状につながっているイメージです。例えば32ビット幅でメモリ空間をみて、

 0番地 |01|02|03|04|
 4番地 |11|12|13|14|
 8番地 |21|22|23|24|

32ビットアクセスは、これを真横に一直線に切る形のアクセスだけが許可されています。01~04、11~14は可。02~11もひとつながりの4バイトですが、アクセスできません。32ビット境界をまたいでしまうからです。13~22の4バイトも同様の理由でアクセス不能です。13は偶数番地ですが、ダメです。

16ビットアクセスも同じで、イメージとしては16ビット幅でメモリ空間が見えていて、それを真横に切るアクセスだけが許可されています。上のメモリイメージを16ビット幅で見るとこうなります。

 0番地 |01|02|
 2番地 |03|04|
 4番地 |11|12|
 6番地 |13|14|
 8番地 |21|22|

「03、04」の2バイトはアクセスできますが、「12、13」は一度のアクセスではできません。16ビット境界をまたいでしまうからです。

単純に奇数番地がアクセスできないのではなく、「アクセスしたいデータのビット幅のアドレス境界をまたぐようなアクセス」ができないのです。

1バイト(8ビット)アクセスがどのアドレスに対しても(偶数番地・奇数番地問わず)可能なことは自明ですね。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值