C语言字节对齐

来源:互联网 发布:java http发送图片 编辑:程序博客网 时间:2024/05/23 01:13

一直没有深究过,近日才把这些搞明白了,做个记录,加深记忆。

       由于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。

原创粉丝点击