为何要考虑字节对齐?

来源:互联网 发布:网络名片制作 编辑:程序博客网 时间:2024/06/01 15:30

某天某人面试

某考官:对字节对齐了解吗

答曰:当然了解,学嵌入式或者做协议的必须了解,blablabla...

某考官:那为什么会有字节对齐呢?

答曰:提高数据的存取效率。

某考官:怎末提高的呢?

答曰:我只知道这么用,至于具体为啥设计,不懂。

某考官(笑了笑,估计得意的,小样儿,终于问倒你了):体系结构应该学过呀(当然很小声的嘟噜了依据)

答案:

--------------------------------------------------------------------------------
编译器为程序分配内存时,为什么要进行字节对齐?什么时候进行字节对齐?
对如下声明:
char a[17];
int i;
其中i为4字节长度,若编译器对齐方式为4字节,是不是要分配24字节,其中头17个分配给字符型数组a,中间空3字节,后4字节分配给i?这么做有什么好处?
--------------------------------------------------------------------------------
主要是考虑到CPU的存取速度。
--------------------------------------------------------------------------------
主要是因为现代计算机都使用了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,会非常慢)的机会会增加,这些都降低了程序的速度。
--------------------------------------------------------------------------------
内存也是按照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宏来决定对齐的具体方式