字节对齐的剖析
一、需要了解的名词和概念
1、数据类型自身的对齐值:即数据本身所占字节长度。
2、结构体或类的自身对齐值:即其中数据成员类型对齐值的最大值。
3、指定对齐值:由编程人员通过#pragma pack(value)指定的value值,通过#pragma pack()代码解除。
4、结构体、类、数据成员的有效对齐值:即2、3以及当前计算机总线长度三者的最大值。
5、圆整: 即结构体成员变量占用总长度需要是对结构体有效对齐值的整数倍
以上为理解字节对齐的最基本要求,请耐心看完。
二、CPU的指令运行过程
在讨论字节对齐之前先简单看一下CPU对指令处理读写指令的工作过程:首先CPU从PC(程序计数器)中得到指令地址,通过总线从内存中取出指令(即其操作码+地址码),放入IR(指令寄存器)中(PC->AR[地址寄存器]->bus->DR[数据寄存器]->IR)对操作码进行译码,得到具体操作,同时PC自增1(下一条指令)。上述过程消耗一个CPU周期(机器周期)。然后进入下一个CPU周期,CPU取出其操作对象的地址码,通过总线在内存中定位到该地址,再进入下一个周期,若此时为写操作,则直接将数据写入到内存地址中,操作结束,若为读操作,则将数据通过总线从内存中取到CPU中,然后交由累加器或者其他控制元件进行处理完毕。个人认为,cache速度小于寄存器速度,故读取数据应当耗时更多,但由于计算机由CPU周期控制,在同步时钟信号的控制下应当是一样的,如果异步控制可能略有差异。