你想像如下情形:内存是一根数轴,上面有等距刻度,每种CPU,都有最佳的寻址动作,它能快速地定位到刻度上、以刻度为单位跳跃,如果落在刻度中间,就需要前后挪动,效率就要打折扣。编译器为了照顾这种计算机,会把每个变量的起始地址安置在刻度上,以方便CPU寻址,这样编译出来的变量体,占据的空间都是以刻度为单位的。这就是所谓的“字对齐”,正如你知道,“字”是16位即2Byte,所以这种机器下的变量分配,其起始地址和尺寸都是以2Byte为距离的。不同的机器有不同的寻址特点,不是千遍一律的,我们不能假定编译器分配出来的变量尺寸到底是多大,唯一准确的办法,是使用内置的尺寸刻度,比如sizeof(),千万不要去猜测这个值是多少。
在单个char变量中,它的sizeof()是1Byte,但不等于3个char组成的字符串就真占3Byte空间,紧跟在这个字符串后面的变量,其起始地址可能跟前面的隔空了1Byte,这相当于那个字符串占了4Byte,但sizeof()这个字符串,又不等于是它实际占据的空间尺寸。你给出的那个结构体A,char在最后位置,其sizeof(A)是否把char占了两位,是不得而知的,但如果把这个char放在开头,它就必定占2Byte,总之,整个A占据的空间,也是2Byte的整数倍,放在最后,编译器怎么处理,是编译器的事。在嵌入式编程中,就会遇到这种问题,通过直接给出地址偏移量来快速定位,这个时候就会遇到字对齐的问题,要仔细测试,不同的机器有不同的行为特点,这样写出来的程序是没有多少可移植性的。
16位以2Byte为单位,但不见得32位和64位机器下这样也高效,那是硬件设计者的事。写软件的,大致了解有这么一种情况就可以了,不要跑过界,去混硬件。除非你专门干这一行。