编译器为程序分配内存时,为什么要进行字节对齐?什么时候进行字节对齐?
对如下声明:
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容量有限,不能把内存所有的东西都放进去,所以当CPU要用到一些cache中没有的东西时cache就要从内存调入了,如何调入呢?
一个L1 DATA CACHE相当于一块小的内存,我们假设它为16K大,它会与一般物理内存交互。
它和内存交互一般一次传输16个字节(32个字节),也就是:
CACHE 字节0-15一次写到/读取物理内存 ,字节16-31一次写到/读取物理内存.32-47 ... ...
这些一次被传输的字节被称为cache line。
假设对象A的一个字段长为16个字节,如果它放在物理地址 0-15,那么它将和cache的第一个cache line 交互,如果放在物理地址 8-23,那么 ,如果CPU要访问这个字段,必须将第一个和第二个cache line 都读入,才能获得这个字段的信息,显然这样速度慢,所以一般字段需要cache line对齐。