一直没有深究过,近日才把这些搞明白了,做个记录,加深记忆。
由于CPU存数据时是以byte为单位,但在读取数据时所采用的方式上有限制,比如有的cpu只能从偶地址起读数据,有的cpu只能从地址为4的倍数的地方读数据,这就要求数据存放时要符合一定的顺序,不然cpu可能要多耗时钟,比如一个short型的数据如果跨边界,就要分两次才能读完。所以各类数据按照一定的规则在空间上排列(数据存放时要与边界对齐),而不是顺序的一个一个的排放,这就是所谓的字节序对齐(一般情况下,纯char型按一字节对齐,带short型按照2字节对齐,带int型的按4字节对齐)。
这里以通用的32为cpu为例加以说明。
比如定义这样一个结构体:
Struct example1{
char i;
short j;
int k;
};
Struct example2{
char i;
char i1;
short j;
int k;
};
Struct example3{
char i;
char i2;
char i3;
short j;
int k;
};
sizeof(example1)、sizeof(example2)、sizeof(example3)分别为2、2、3;
字节顺序:example1
_1__|__1__|____2_____|_______4____________|
i | null | j | k |
字节顺序:example2
_1__|__1__|____2_____|_________4__________|
i | i1 | j | k |
字节顺序:example13
_1__|__1__|__1__|__1_|____2_____|_____2_____|_________4__________|
i | i1 | i2 | null | j | null | k |
可以看出,字节安定义顺序排列(默认情况下),在边界对齐的前提下,能放下进该四字节地址内则放,不能则空出剩余的byte,放入下word内,首先保证字节对齐。
结构体在内存组织上是顺序式的,而联合体是重叠式的,各成员共享一段内存,联合体的长度等于其内最长成员的长度。比如如果一个联合体内的size最大成员是一结构体,则这个size就是该联合体的size。