为什么32位系统4字节对齐效率最高?

嘤鸣求友 2012-11-23 07:56:36
大家都知道内存的数据对齐吧?
但是为什么32位系统4字节对齐效率最高?可能有人会说“地址总线总是按照对齐后的地址来访问的,访问效率会高很多”
但这是编译器层面的,我想了解究竟是底层什么机制导致这个结果?
还有如果必须按4字节对齐来访问内存, 那么32位系统只需要30根地址总线就够了,为什么还是32根?
望各位前辈指点迷津……
...全文
828 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
jf364479726 2012-12-22
  • 打赏
  • 举报
回复
引用 1 楼 mymtom 的回复:
简单来说吧 比如这么一个结构体 struct foo { short s; int n; }; struct foo bar; 假设bar的地址是0x12345670 如果不按4字节对齐 那么bar.n的地址就是0x12345672, 也就是下面的黑体部分 0x12345670 a0 a1 a2 a3 0x12345674 b0 b1 b……
啊,抱歉错了,点成丢板砖了。。 其实我是想问一下,cache line的存在应该会很大程度上减小这种不对齐造成的性能损失的吧?
  • 打赏
  • 举报
回复
引用 12 楼 mujiok2003 的回复:
32位CPU的地址总线32根,寄存器是32位的。
mujiok2003 2012-11-24
  • 打赏
  • 举报
回复
32位CPU的地址总线32根,寄存器是32位的。
Binzo 2012-11-24
  • 打赏
  • 举报
回复
4*8 = 32. 1bytes = 8bit.
wanglu343280746 2012-11-24
  • 打赏
  • 举报
回复
引用 6 楼 weiran2009 的回复:
引用 2 楼 turingo 的回复: ++,另外4个字节为4x8=32,何来30根地址总线?再说也是32位的数据总线,指的是位宽而不是地址。 引用 1 楼 mymtom 的回复: 简单来说吧 比如这么一个结构体 struct foo { short s; int n; }; struct foo bar; 假设bar的地址是0x12345670 如果不按4字……
2的30次方乘以4,不是20次方
赵4老师 2012-11-23
  • 打赏
  • 举报
回复
地址总线
ckc 2012-11-23
  • 打赏
  • 举报
回复
并不是必须,而是对齐了速度比较快 这个应该是cpu设计时决定的,比如对齐了可以一次取出4个字节,如果没对齐需要取两次,这样速度就慢了 另外这个并不能减少地址总线根数,因为还是有取单一数据的需求
图灵狗 2012-11-23
  • 打赏
  • 举报
回复
++,另外4个字节为4x8=32,何来30根地址总线?再说也是32位的数据总线,指的是位宽而不是地址。
引用 1 楼 mymtom 的回复:
简单来说吧 比如这么一个结构体 struct foo { short s; int n; }; struct foo bar; 假设bar的地址是0x12345670 如果不按4字节对齐 那么bar.n的地址就是0x12345672, 也就是下面的黑体部分 0x12345670 a0 a1 a2 a3 0x12345674 b0 b1 b……
mymtom 2012-11-23
  • 打赏
  • 举报
回复
简单来说吧 比如这么一个结构体 struct foo { short s; int n; }; struct foo bar; 假设bar的地址是0x12345670 如果不按4字节对齐 那么bar.n的地址就是0x12345672, 也就是下面的黑体部分 0x12345670 a0 a1 a2 a3 0x12345674 b0 b1 b2 b3 为了取到n的值就需要访问两次内存,一次访问0x12345670,一次访问0x12345674 然后把两个int值组合在一起,a2 a3 b0 b1
图灵狗 2012-11-23
  • 打赏
  • 举报
回复
任何事情都应该抓住主要茅盾,一般情况下你无需去理会对不对齐的问题,只有必须考虑速度因素的,或者是某些地方芯片要求必须对齐,然后再作相应的处理即可。
引用 8 楼 weiran2009 的回复:
引用 3 楼 ckc 的回复:并不是必须,而是对齐了速度比较快 这个应该是cpu设计时决定的,比如对齐了可以一次取出4个字节,如果没对齐需要取两次,这样速度就慢了 另外这个并不能减少地址总线根数,因为还是有取单一数据的需求 我在想,数据对齐固然速度快,但是要是搞 嵌入式 单片机什么的,这样做的代价不就是浪费内存空间吗?计算机内存足够大,但万一 单一芯片内存不够怎么办……
嘤鸣求友 2012-11-23
  • 打赏
  • 举报
回复
引用 3 楼 ckc 的回复:
并不是必须,而是对齐了速度比较快 这个应该是cpu设计时决定的,比如对齐了可以一次取出4个字节,如果没对齐需要取两次,这样速度就慢了 另外这个并不能减少地址总线根数,因为还是有取单一数据的需求
我在想,数据对齐固然速度快,但是要是搞 嵌入式 单片机什么的,这样做的代价不就是浪费内存空间吗?计算机内存足够大,但万一 单一芯片内存不够怎么办?
图灵狗 2012-11-23
  • 打赏
  • 举报
回复
32位CPU处理的最小单位就是32位的数据,而数据存放在MEMORY,你如果不按照4字节对齐的话,那么数据会跨越几个存储单元,这样显然增加了处理的次数,而降低了效率。
引用 6 楼 weiran2009 的回复:
引用 2 楼 turingo 的回复:++,另外4个字节为4x8=32,何来30根地址总线?再说也是32位的数据总线,指的是位宽而不是地址。 引用 1 楼 mymtom 的回复: 简单来说吧 比如这么一个结构体 struct foo { short s; int n; }; struct foo bar; 假设bar的地址是0x12345……
嘤鸣求友 2012-11-23
  • 打赏
  • 举报
回复
引用 2 楼 turingo 的回复:
++,另外4个字节为4x8=32,何来30根地址总线?再说也是32位的数据总线,指的是位宽而不是地址。 引用 1 楼 mymtom 的回复: 简单来说吧 比如这么一个结构体 struct foo { short s; int n; }; struct foo bar; 假设bar的地址是0x12345670 如果不按4字节对齐 那么bar.n的地址就是0x12……
是不是cpu设计时必须按机器字对齐寻址? 有位网友告诉我: 2的20次方乘以4 = 2的32次方 这样理解对不对?
嘤鸣求友 2012-11-23
  • 打赏
  • 举报
回复
引用 1 楼 mymtom 的回复:
简单来说吧 比如这么一个结构体 struct foo { short s; int n; }; struct foo bar; 假设bar的地址是0x12345670 如果不按4字节对齐 那么bar.n的地址就是0x12345672, 也就是下面的黑体部分 0x12345670 a0 a1 a2 a3 0x12345674 b0 b1 b2 b3 为了取到n的值……
那么,这个有没有限制呢?是不是cpu设计时必须按机器字对齐寻址?

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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