字节对齐

1. 对齐的作用和原因
各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐。其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit数据。显然在读取效率上下降很多

例,一个int的地址是0x03的话,先是按地址0x00取int的第一个byte,然后按地址0x04取剩下的三个byte

2. 编译器是按照什么样的原则进行对齐的

  1. 数据类型自身的对齐
    对于char型数据,其自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4,单位字节
  2. 结构体或者类的自身对齐值
    其成员中自身对齐值最大的那个值
  3. 指定对齐值
    pragma pack (value)时的指定对齐值value

3. 自然对齐
对齐跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的

原文地址:https://www.cnblogs.com/zhangxuechao/p/11709856.html