内存对齐规则第一个成员在与结构体偏移量为0的地址处。结构体内成员变量的起始偏移量是其对齐数的整数倍。非自定义成员变量的对齐数 min{编译器默认的一个对齐数 该成员的类型大小}注意char x[5]的对齐数是1而不是5因为比较的是类型大小不是变量大小自定义成员变量的对齐数是该自定义成员变量的最大对齐数minmax其成员变量的对齐数默认对齐数。结构体总大小必须是最大对齐数的整数倍。修改编译器默认对齐数从上面的规则也可以看出编译器默认的对齐数充当一个上限的作用#pragma pack(4) //可以改成3,5,7等奇数但是编译器可能会做调整为什么存在内存对齐平台原因(移植原因)。不是所有的硬件平台都可以访问任意地址上的任意数据的某些硬件平台只能在某些地址处取某些特定类型的数据否则抛出硬件异常。性能原因。数据结构(尤其是栈)应该尽可能地在自然边界上对齐原因在于为了访问未对齐的内存处理器需要做两次内存访问而对齐的内存访问只需要一次访问内存对齐对数据传输的影响由于各个操作系统编译器的内存对齐规则可能是不同的。这样一来如果两台主机直接用结构体进行数据传输它们对结构体的大小定义不同从而造成数据错乱因此我们在网络中传输数据一般都需要序列化反序列化。不过操作系统为了效率是直接传输结构体的比如添加的报头就是一个结构体。OS通过强制把结构体内存布局修改符合网络标准以实现结构体正确传输。