当前位置: 技术问答>linux和unix
内存地址的疑问
来源: 互联网 发布时间:2016-10-26
本文导语: (在arm上运行)在使用localtime_r(&Time, &logtime)函数时,已近获取到的Time值是正确的,但是打印logtime时,如果logtime放在奇地址开始的位置就会出错,但是logtime放在偶地址开始的地方时就可以得到正确的结果, 我看了...
(在arm上运行)在使用localtime_r(&Time, &logtime)函数时,已近获取到的Time值是正确的,但是打印logtime时,如果logtime放在奇地址开始的位置就会出错,但是logtime放在偶地址开始的地方时就可以得到正确的结果,
我看了一些文献,说“CPU只能在能够被4整除的地址进行内存访问”,我想问的是是否不同的cpu对内存操作有什么限制,
针对放在奇地址上的数据是否 不同的cpu会有什么不同的处理方式吗
我看了一些文献,说“CPU只能在能够被4整除的地址进行内存访问”,我想问的是是否不同的cpu对内存操作有什么限制,
针对放在奇地址上的数据是否 不同的cpu会有什么不同的处理方式吗
|
与体系结构相关。ARM下读取无符号32位整形变量WORD32按4字节边界开始读取。
你用汇编跟踪一下就知道了,比如代码中写了读取0X00000005开始的WORD32,实际读取的就是0X00000004开始的WORD32。
你用汇编跟踪一下就知道了,比如代码中写了读取0X00000005开始的WORD32,实际读取的就是0X00000004开始的WORD32。
|
因为CPU得执行速度很快,程序的快慢就取决于取指令的速度。
如果没有边界对齐,就会对一个变量连续读两次,如果CPU对
这种情况的处理能力又不行,就回浪费很长的时间来应付这种
失误(当然是程序员造成的)。x86对这种情况的处理能力还
是挺不错的,不过现在的IA-32架构的CPU已经向ARM学习,将
指令转换成统一长度,这样读取,执行起来就快捷得多。
如果没有边界对齐,就会对一个变量连续读两次,如果CPU对
这种情况的处理能力又不行,就回浪费很长的时间来应付这种
失误(当然是程序员造成的)。x86对这种情况的处理能力还
是挺不错的,不过现在的IA-32架构的CPU已经向ARM学习,将
指令转换成统一长度,这样读取,执行起来就快捷得多。