字节对齐浅析

1. 为什么要对齐
以32位CPU为例,它一次可以对一个32位的数进行运算,它的数据总线的速度是32位。它从内存中一次可以存取的最大位数为32位。这个数叫CPU的字。
 
在进行硬件设计时将存储体组成32位宽。
 
将变量进行对齐,包括机构体中的变量,变量与变量之间的空间叫padding,有时为了对齐在一个机构体的最后也会填入padding,通常叫tail padding.
 
2. 基本数据类型的Align 值
每种基本数据类型都有它的自然对齐方式Natural Alignment,ALign的值与该数据类型的大小相等。同时用户还可以指定一个Align值(使用编译开关或使用#pragma)
当用户指定了ALign值N后,该数据实际的Align值根据如下规则取得:
Actual Align = min(N, Natural Align)
 
3. 复杂类型的对齐值
struct 结构的Align值等于该结构所有成员的Actual ALign值中最大的一个。
Array 即数据的Align值就是给数组成员的Actual Align值
Union联合类型Align值等于该联合最大成员的Actual Align值。
 
4. 根据一个类型Align 值来分配空间的规律
   1.一个结构成员的offset等于该成员Actual Align值的整数倍。
   如果凑不成整数倍,就在其前面加padding。
   struct stTest
  {
            char szChar1;
            int iCount;
  }
  int 型Actual Align值为4,所以iCount需要在其前面加三个字节。padding 已保证offset 为4。
    2. 一个结构体大小等于该结构Actual Align值的整数倍,如果凑不成整数倍,就要在其后加padding,即tail padding。一个结构体的大小在其定义时就已确定,不会因为其Actual Align值的改变而改变 
 
 
 
 
 

你可能感兴趣的:(职场,休闲)