80分:为什么要字节对齐?

lzhongsh 2005-03-31 12:05:53
编译器为程序分配内存时,为什么要进行字节对齐?什么时候进行字节对齐?

对如下声明:
char a[17];
int i;
其中i为4字节长度,若编译器对齐方式为4字节,是不是要分配24字节,其中头17个分配给字符型数组a,中间空3字节,后4字节分配给i?这么做有什么好处?
...全文
390 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
MagicCarmack 2005-04-03
  • 打赏
  • 举报
回复
学到了,以前送来没注意到这个
dragonfly001 2005-04-01
  • 打赏
  • 举报
回复
學習中......................
boyate 2005-04-01
  • 打赏
  • 举报
回复
学到了,以前送来没注意到这个
许野平 2005-03-31
  • 打赏
  • 举报
回复
主要是考虑到CPU的存取速度。
寻开心 2005-03-31
  • 打赏
  • 举报
回复
下面两个连接可以回答你的问题
http://dev.csdn.net/article/56/56202.shtm
http://www.bd66.com/InfoView/Article_184.html
寻开心 2005-03-31
  • 打赏
  • 举报
回复
内存也是按照bank来对齐的

内存按照软件来理解的是连续的存储单元
但是对于硬件来说,是分bank的
一段连续的内存地址,由4个bank构成时候,地址和bank之间的对应关系如下

内存地址 0 1 2 3 4 5 6 7 8 9 10 。。。。
bank 分布 0 1 2 3 0 1 2 3 0 1 2 ......

pc是总线公用,是分时公用的,有时候是地址,有的时候是数据
对于从0开始的4个字节, 可以传一个地址,一次读取,4个bank并行,各自返回一个字节的
但是非0开始的4个字节,就要分两次传地址,4个bank无法同时并行


再说
地址对齐主要是针对 struct, union,class这些类型来说的

对于函数当中的单独变量,地址先后顺序是没有关系,没有规定的

地址对齐是编译器的控制行为,pack宏来决定对齐的具体方式
mathe 2005-03-31
  • 打赏
  • 举报
回复
主要是因为现代计算机都使用了Cache。
Cache可以看成一些可以用非常快的速度进行访问的临时内存。但是Cache的容量不大,比如一般一级Cache只有几K到几十K,二级Cache只有几百K到几M.这个同数G的内存相比,是比较小的。
但是CPU访问内存非常慢,所以硬件会将平时经常使用的内容存放到Cache里面。
Cache是通过一些Cache Line来组织的,每一条Cache Line一般包含16个字节,32个字节或64个字节等。 比如某个计算机一级Cache的Cache Line长度是32个字节,那么每段Cache Line总是会包含32个字节对齐的一段内存。
现在有一个4字节的整数,如果它的地址不是4字节对齐的,那么就有可能访问它的时候,需要使用两条Cache Line,这增加了总线通讯量,而且增加了对Cache的使用量,而且使用的数据没有在Cache里面(这时需要将数据从内存调入Cache,会非常慢)的机会会增加,这些都降低了程序的速度。

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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