其实主要是为了效率,也就是处理器从内存中读取数据的时候,可以使用尽量少的操作,从而读取到完整的数据类型,我用硬件底层来说明一下这个道理,我们暂时以 4 字节对齐为例。
我们知道在内存的总线系统中,地址线其实都是从 A2 开始的,A0和 A1 一般都悬空,这是因为Arm 系统中硬件地址访问也是按照 4 字节对齐访问的。
这样我们可以通过地址 0,4,8 这样的地址读到 int 类型的数据,假如我们在结构体中强制按照 1 字节对齐,这个时候很可能出现一个 int 类型的起始地址不在 0,4,8这样的对齐地址上,而是放在了 地址 5 上,那么我们的硬件要是读取这个变量,则需要先读取 地址4,再读取一次 地址 8。然后通过左右移位才能组合出一个完整的变量,这里的多次读取就涉及到了效率问题了。
这里是从底层的硬件接口剖析,到软件上层的处理,道理也是一样的。
|