数据对齐是跟数据在内存中的位置相关的话题。如果一个变量的内存地址正好是他长度的整数倍,那么它就叫做自然对齐。
举例来说,一个32位的整型数据,如果他在内存中的地址刚好可以被4整除,我们就说这个整型数是自然对齐的。
在编译过程中,可以通过编译器来调整数据对齐。
一般在默认情况下,对于标准数据类型来说,它的地址只要是其长度的整数倍就对齐了,而对于费标准的C数据类型按照下面的原则对齐。
1.对于数组,只要按照基本数据类型进行对齐就可以了
2.对于联合,只要他包含的长度最大的数据类型能够对齐就可以了
3.对于结构体,只要它包含的长度最大的数据类型能够对齐就可以了。
结构体还会引入填补机制。填补因对齐我形成的空洞。
对于未对齐的数据结构,一些体系结构要求非常严格。在这种处理器中,访问未对齐的数据会导致处理器陷入,而另外一些处理器,则会导致未定义错误,比如ARM它将会调整地址为对齐之后再读写,而在另外一些体系结构上,则可以正常读写数据,只是性能会下降。
比如在X86体系的PC上,读一个对齐的int,他会一次读32位。
而对于未对齐的int,他会读两次,每次读32位,然后再计算出要读取的数据。