关于字节对齐

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

       由于CPU存数据时是以byte为单位,但在读取数据时所采用的方式上有限制,比如有的cpu只能从偶地址起读数据,有的cpu只能从地址为4的倍数的地方读数据,这就要求数据存放时要符合一定的顺序,不然cpu可能要多耗时钟,比如一个short型的数据如果跨边界,就要分两次才能读完。所以各类数据按照一定的规则在空间上排列(数据存放时要与边界对齐),而不是顺序的一个一个的排放,这就是所谓的字节序对齐(一般情况下,纯char型按一字节对齐,带short型按照2字节对齐,带int型的按4字节对齐)。

       这里以通用的32cpu为例加以说明。

比如定义这样一个结构体:

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)分别为223

字节顺序: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值