访问未对齐的内存,处理器需要作两次内存访问?

karlfixed 2009-10-06 09:31:15
我知道如何对齐,但就是不知道Why? 访问未对齐的内存,为什么需要作两次或多次的内存访问?请指教
...全文
428 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
飞天御剑流 2009-10-06
  • 打赏
  • 举报
回复 1
不对齐的条件下,访问n依然从a开始,第一次读取四个字节,然后第二次再读取n剩下的那个字节,读取这剩下的一字节过程也不是只读取一个字节,而是4个字节的内容同时出现在数据线上。
karlfixed 2009-10-06
  • 打赏
  • 举报
回复 1
我知道32位地址线一次读4字节,但是
struct A
{
char a;
int n;
}
假设a占用1号内存,n占2~5 (不做对齐处理)

a占用1~4 n占用5~8
试问,如何体现出来
PS:我学过计算机组成原理和微机原理,但是讲访存的部分没什么映像。
ZangXT 2009-10-06
  • 打赏
  • 举报
回复
画一下地址线的结构就明白了。
32位地址线的话,对应的是4个字节的内存单元,可以一次进行读写。
galafx 2009-10-06
  • 打赏
  • 举报
回复 1
不知道对不对哈,我接触对齐没多久。

struct aa
{
char a;
int b;
};

假设32位机器。

如果没有对齐,那么结构体aa占5个字节。

就是a占一个(0号地址),b占后四个(1~4号地址)。

那么要读取b,32位机嘛,一次读4个字节,但是只能从能被4整除的地址单元开始读。

那么就要先读0~3,然后留下1~3三个字节。

再读4~7,留下4,这个字节。

然后再将两次的结果拼到一起。

想想,这么多工作,何只是读两次这么简单,节省了空间,但浪费了太多的时间。
arong1234 2009-10-06
  • 打赏
  • 举报
回复
因为CPU地址总是在对齐的地方开始,这样如果你一个4字节的整数跨越了边界,CPU不能对齐到哪个整数的开始位置,只能先取这个整数的前半部分,再取后半部分,然后拼起来一个完整的整数。这是硬件知识,当作常识即可,没必要开始学就研究这个

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧